Ios openURL不';我不能在股份扩展中工作

Ios openURL不';我不能在股份扩展中工作,ios,ios8,ios-app-extension,Ios,Ios8,Ios App Extension,正在尝试使用[self.extensionContext openURL:…completionHandler:…]在iOS 8共享扩展中打开包含的应用程序从不打开该应用程序,并始终使用success=NO调用完成处理程序 操作扩展也存在同样的问题,但我认为共享扩展能够打开包含的应用程序比操作扩展更合理。共享扩展的要点是上传一段可能很大的数据,而不打开应用程序的唯一方法是通过NSURLSession,它只能进行HTTP(S)上传。但应用程序可能希望通过与HTTP上传不同的机制共享内容 苹果公司的

正在尝试使用
[self.extensionContext openURL:…completionHandler:…]
在iOS 8共享扩展中打开包含的应用程序从不打开该应用程序,并始终使用success=NO调用完成处理程序

操作扩展也存在同样的问题,但我认为共享扩展能够打开包含的应用程序比操作扩展更合理。共享扩展的要点是上传一段可能很大的数据,而不打开应用程序的唯一方法是通过
NSURLSession
,它只能进行HTTP(S)上传。但应用程序可能希望通过与HTTP上传不同的机制共享内容


苹果公司的文档没有声明,
openURL…
不能用于任何特定类型的扩展。很难知道这是一个bug还是预期的行为。没有关于这方面的官方信息。

文档确实表明“扩展点决定是否支持此方法”,实际上只有那些使用今日扩展的人才能使用openUrl启动其主机应用程序。共享、操作、键盘和文档提供程序不适用于任何人(beta 5)。

以下是一些可能的解决方法

实际有效的方法可以总结为:

  • 使用UIDocumentInteractionController并使用特殊扩展类型注册容器应用,以从扩展中打开容器应用
  • 使用虚拟NSURLSessionTask获取要调用的容器应用程序的UIApplicationLegate类的
    应用程序:handleEventsForBackgroundURLSession:completionHandler:
    方法。然后,在该方法中,您可以调用
    [[UIApplication-sharedApplication]openURL:url]
    来打开您想要的任何内容
这两种方法都不完美,但它们确实有效(但不确定苹果是否会喜欢它们)。有关更多详细信息,请查看链接。希望这有帮助:)


编辑:您也可以使用UIWebView,如所述

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

  • 使用
    UIViewController
    (而不是默认的
    SLComposeServiceViewController
    )子类进行共享扩展,以添加自定义布局
  • 添加一个
    UIWebView
    并加载一个HTML字符串,其中包含指向应用程序自定义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];
UIWebView*webView=[[UIWebView alloc]initWithFrame:CGRectMake(0,0,0,0)];
NSString*urlString=@”https://itunes.apple.com/us/app/watuu/id304697459";
NSString*内容=[NSString stringWithFormat:@',urlString];
[webView loadHTMLString:content-baseURL:nil];
[self.view addSubview:webView];
[webView performSelector:@selector(removeFromSuperview),对象:nil afterDelay:2.0];
请注意,在本例中,我将从UIInputViewController实例化此调用

使用包含应用程序的URL方案时,此方法也应有效。您必须先设置URL方案。我已使用此应用程序,我的应用程序已成功提交到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)

}

这说明了一点情况。我也希望这样做,就像iOS 7中的YouTube共享一样,我想提供一个
UIAlertController
,让用户可以查看他们刚刚共享的内容。这是一个非常不连贯的体验。可能重复的“共享、操作、键盘和文档提供程序对任何人都不起作用(beta 5)”,对,但这在任何地方都没有记录。这可能是一个bug。也许吧,但如果它是基于苹果对扩展应该是什么和做什么的意图而设计的,我也不会感到惊讶。也可以看到这条线索:也许他们还在决定。。。