openURL在Share扩展中不起作用

时间:2014-07-22 18:33:22

标签: ios ios8 ios-app-extension

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

Here与Action扩展相同,但我认为共享扩展能够打开包含应用程序比使用Action扩展更合理。共享扩展的要点是上传可能很大的数据,并且在不打开应用程序的情况下执行此操作的唯一方法是NSURLSession,它只能执行HTTP(S)上传。但是,应用程序可能希望通过与HTTP(S)上载不同的机制来共享内容。

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

5 个答案:

答案 0 :(得分:8)

以下是一些可能的解决方法...... Communicating with/opening Containing app from Share extension

实际工作的那些可以概括为:

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

这些方法都不完美,但它们确实有效(不确定苹果是否会喜欢它们)。有关详细信息,请查看链接。希望这会有所帮助:)

编辑:您还可以使用描述为https://stackoverflow.com/a/24614589/3923882

的UIWebView

答案 1 :(得分:1)

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

答案 2 :(得分:0)

我使用的方法不涉及任何后台任务:

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

点击网络链接会启动该应用,可以直接在NSUserDefaults中获取数据。

答案 3 :(得分: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方案

答案 4 :(得分:0)

https://www.jianshu.com/p/a24ae0eb69d5,您必须先设置url方案。我已经使用了它,我的应用已成功提交到AppStore。

const quizId = this.activatedRoute.snapshot.paramMap.get('quizId');
const indexOfQuizId = this.quizData.findIndex(el => el.id === quizId);