openURL在共享扩展中不起作用
尝试使用[self.extensionContext openURL:... completionHandler:...];
在iOS 8共享扩展中打开包含的应用程序永远不会打开应用程序,并始终调用成功=否的完成处理程序。
这是与行动扩展相同的问题,但我认为共享扩展能够打开包含应用程序比行动扩展更合理。 共享扩展的意义在于上传一个潜在的大量数据,唯一不用打开应用程序的方法是通过NSURLSession
,它只能进行HTTP(S)上传。 但是应用程序可能希望通过与HTTP(S)上传不同的机制来共享内容。
苹果文档没有声明openURL...
不能用于任何特定types的扩展。 很难知道这是一个错误还是有意的行为。 没有关于这方面的官方信息。
以下是一些可能的解决方法… 与/开放通信从共享扩展包含应用程序
实际工作的人可以概括为:
- 使用UIDocumentInteractionController并使用特殊的扩展types注册容器应用程序,以便从您的扩展中打开容器应用程序
- 使用虚拟NSURLSessionTask获取
application:handleEventsForBackgroundURLSession:completionHandler:
要调用的容器应用程序的UIApplicationDelegate类的方法。 然后,在这个方法中,你可以调用[[UIApplication sharedApplication] openURL:url]
打开你想要的任何东西。
这两种方法都不是完美的,但它们确实有效(不知道苹果是否会喜欢它们)。 有关更多详细信息,可以查看链接。 希望这可以帮助 :)
编辑:您也可以使用所描述的一个UIWebView https://stackoverflow.com/a/24614589/3923882
文档确实表明“扩展点决定了是否支持这种方法”,实际上只有那些使用“今日扩展”的人才能够使用openUrl来启动他们的主机应用程序。 共享,操作,键盘和文档提供程序不适用于任何人(testing版5)。
我正在使用这个不涉及任何后台任务的方法:
- 使用
UIViewController
(而不是默认的SLComposeServiceViewController
)子类进行共享扩展,以添加自定义布局; - 添加一个
UIWebView
并加载一个HTMLstring,指向您的应用的自定义URL的链接; - 实现
webView:shouldStartLoadWithRequest:navigationType:
方法来拦截链接上的点击,并在返回YES之前使用NSUserDefaults
和initWithSuiteName:
提供应用程序组的名称)将数据保存到由扩展和包含应用程序共享的容器中。
点击Web链接启动应用程序,它可以直接获取NSUserDefaults
的数据。
这是我使用我的键盘扩展。 我希望它在这里也有帮助:
UIWebView * webView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, 0, 0)]; NSString *urlString = @"https://itunes.apple.com/us/app/watuu/id304697459"; NSString * content = [NSString stringWithFormat : @"<head><meta http-equiv='refresh' content='0; URL=%@'></head>", urlString]; [webView loadHTMLString:content baseURL:nil]; [self.view addSubview:webView]; [webView performSelector:@selector(removeFromSuperview) withObject:nil afterDelay:2.0];
请注意,在这种情况下,我从UIInputViewController实例化这个调用。
此方法也应该使用来自包含应用程序的URLscheme