这篇SO帖子解决了如何通过排除AirDrop或打印等服务来自定义UIActivityViewController.
它还提到这个Apple文档突出了支持的股票服务,但我们如何识别其他受支持的端点,如Line和其他消息应用程序?
特别:
(1)Skype,Kakao,Line,Viber,WeChat,Kik,WhatsApp和Facebook Messenger(不适合Facebook)有终点吗?
(2)这些终点是什么?
您目前无法在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://"]];
在内部,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];
}
}
Skype使用"skype:"
URI,官方文档中的更多信息
Kakao&Line,带有DCActivity(Kakao似乎有官方API,但文档在韩国)
线,带LINEActivity
WeChat,带有WeixinActivity(还有一个官方API,您可以使用它来制作自己的UIActivity)
WhatsApp使用"whatsapp:"
URI,官方常见问题解答中的更多信息,WhatsApp还有各种UIActivity实现,请在cocoapods.com上查看它们
Facebook Messenger使用"fb-messenger:"
URI,tia的其他答案中的更多信息,也看到了解决方法.
Kik有一个公共API,但我知道没有SDK或UIActivity实现.另外,请参阅变通方法.
Viber没有SDK也没有公共API,请参阅解决方法.
这些服务中的大多数都基于已知的协议,或者它们的细微变化.例如,您可以使用XMPP(aka Jabber)直接向Facebook IM或Kik帐户发送消息; 有人说Viber似乎使用SIP的修改来与VoIP电话进行信令.因此,您可以通过使用底层机制解决一些SDK/API限制.
如果您只需要向这些服务发送消息,我认为您不需要通过SDK或URL方案与已安装的应用程序通信,我无法测试您的Big Emoji应用程序提到,因为它只是在iOS 8上崩溃,但如果它使用服务API,你可以通过使用Charles或Wireshark轻松解决它.