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之前使用NSUserDefaultsinitWithSuiteName:提供应用程序组的名称)将数据保存到由扩展和包含应用程序共享的容器中。

点击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