7

尝试[self.extensionContext openURL:... completionHandler:...];在 iOS 8 Share 扩展程序中使用来打开包含的应用程序永远不会打开应用程序,并且总是以成功 = NO 调用完成处理程序。

是与操作扩展相同的问题,但我认为共享扩展能够打开包含应用程序比操作扩展更合理。Share 扩展的重点是上传潜在的大量数据,而无需打开应用程序的唯一方法是 through NSURLSession,它只能进行 HTTP(S) 上传。但是应用程序可能希望通过不同于 HTTP(S) 上传的机制来共享内容。

Apple 文档没有说明openURL...不能用于任何特定类型的扩展。很难知道这是错误还是预期行为。没有关于此的官方信息。

4

5 回答 5

8

以下是一些可能的解决方法...从共享扩展程序与/打开包含应用程序进行通信

实际起作用的可以总结为:

  • 使用 UIDocumentInteractionController 并使用特殊的扩展类型注册您的容器应用程序以从您的扩展程序打开您的容器应用程序
  • 使用虚拟 NSURLSessionTask 获取application:handleEventsForBackgroundURLSession:completionHandler:要调用的容器应用程序的 UIApplicationDelegate 类的方法。然后,在该方法中,您可以调用[[UIApplication sharedApplication] openURL:url]以打开您想要的任何内容。

这些方法都不是完美的,但它们确实有效(但不确定 Apple 是否会喜欢它们)。有关更多详细信息,您可以查看链接。希望这可以帮助 :)

编辑:您还可以按照https://stackoverflow.com/a/24614589/3923882所述使用 UIWebView

于 2014-08-12T18:25:13.180 回答
1

文档确实表明“扩展点决定是否支持这种方法”,实际上只有使用 Today Extension 的人才能使用 openUrl 启动他们的主机应用程序。共享、操作、键盘和文档提供程序不适用于任何人(测试版 5)。

于 2014-08-07T18:14:13.443 回答
1

https://www.jianshu.com/p/a24ae0eb69d5必须先设置 url scheme。我已经使用它并且我的应用程序已成功提交 AppStore。

 /// 打开主APP
/// - Parameter type: 打開類型
func openContainerApp(type: String) {

    let scheme = "yoururlscheme://type"

    let url: URL = URL(string: scheme)!

    let context = NSExtensionContext()

    context.open(url, completionHandler: nil)

    var responder = self as UIResponder?

    let selectorOpenURL = sel_registerName("openURL:")

    while (responder != nil) {

        if responder!.responds(to: selectorOpenURL) {

            responder!.perform(selectorOpenURL, with: url)

            break

        }

        responder = responder?.next

    }

    self.extensionContext?.completeRequest(returningItems: [], completionHandler: nil)

}
于 2020-07-13T02:57:19.207 回答
0

我正在使用这种不涉及任何后台任务的方法:

  • 使用共享扩展的UIViewController(而不是默认的SLComposeServiceViewController)子类来添加自定义布局;
  • 添加UIWebView并加载一个 HTML 字符串,其中包含指向您应用的自定义 URL 的链接;
  • 实现webView:shouldStartLoadWithRequest:navigationType:方法来拦截单击链接并在返回 YES 之前使用NSUserDefaultswith initWithSuiteName:(提供应用程序组的名称)将数据保存在您的扩展程序和包含应用程序共享的容器中。

单击网络链接启动应用程序,该应用程序可以NSUserDefaults直接获取数据。

于 2015-01-17T18:48:21.367 回答
0

这是我从键盘扩展中使用的:

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 实例化此调用。

此方法也应该使用包含应用程序的 URL 方案

于 2015-01-20T03:30:00.053 回答