发现UIActivityViewController支持的所有端点,如WeChat,KaKao,Line等?

Cra*_*lot 5 facebook objective-c ios ios7

这篇SO帖子解决了如何通过排除AirDrop或打印等服务来自定义UIActivityViewController.

它还提到这个Apple文档突出了支持的股票服务,但我们如何识别其他受支持的端点,如Line和其他消息应用程序?

特别:

(1)Skype,Kakao,Line,Viber,WeChat,Kik,WhatsApp和Facebook Messenger(不适合Facebook)有终点吗?

(2)这些终点是什么?

Niñ*_*ipt 10

您目前无法在iOS 7上执行此操作,因为出于安全原因,任何应用程序都无法直接与其他应用程序通信.最后一个WWDC的亮点之一是引入了iOS 8的扩展,这将使这成为可能; 您可以阅读创建动作扩展示例中的内容.

然而,有尝试解决这个问题.一个值得注意的例子是IntentKit,它通过拥有已知应用程序的存储库来工作.

什么是IntentKit?

IntentKit是一个开源的iOS库,可以更轻松地链接到其他应用程序.这有点像Android的Intents或Windows Phone的合约.

其中一个尝试的另一个例子是OvershareKit

为何选择OvershareKit?

在iOS上实现共享非常麻烦.UIActivityViewController限制太多,滚动自己的库太耗时了.由于缺乏时间或倾向于做出更好的事情,大多数开发者最终都会选择平庸的分享方式.

OvershareKit为您的iOS应用添加丰富的共享选项变得微不足道.

如何知道是否安装了应用程序?

即使你无法发现它们.如果您知道要查找的应用程序以及它响应的URL方案,那么您可以检查您的应用是否能够打开这种类型的URL.

这就是IntentKit的用途,它是关于应用程序的知识库,它们响应的URL方案以及它们可以执行的操作类型.随着扩展的引入.

例如,您可以通过检查是否可以打开fb://URL 来检查Facebook是否已安装.

BOOL isFacebookInstalled = [[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"fb://"]];
Run Code Online (Sandbox Code Playgroud)

关于IntentKit的内部运作

在内部,IntentKit将检查同样的事情,你可以在INKActivity实现中看到:

- (BOOL)canPerformCommand:(NSString *)command {
    if (!self.actions[command]) { return NO; }

    if (self.presenter) {
        return [self.presenter canPerformAction:command];
    } else {
        NSURL *url = [NSURL URLWithString:[self.actions[command] urlScheme]];
        return [self.application canOpenURL:url];
    }
}
Run Code Online (Sandbox Code Playgroud)

有关所请求的UIActivity服务的信息:

解决方法

这些服务中的大多数都基于已知的协议,或者它们的细微变化.例如,您可以使用XMPP(aka Jabber)直接向Facebook IM或Kik帐户发送消息; 有人说Viber似乎使用SIP的修改来与VoIP电话进行信令.因此,您可以通过使用底层机制解决一些SDK/API限制.


SDK或API?

如果您只需要向这些服务发送消息,我认为您不需要通过SDK或URL方案与已安装的应用程序通信,我无法测试您的Big Emoji应用程序提到,因为它只是在iOS 8上崩溃,但如果它使用服务API,你可以通过使用Charles或Wireshark轻松解决它.