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
- 添加一个
并加载一个HTML字符串,其中包含指向应用程序自定义URL的链接李>UIWebView
- 实现
方法来拦截对链接的单击,并在返回YES之前使用webView:shouldStartLoadWithRequest:navigationType:
和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。也许吧,但如果它是基于苹果对扩展应该是什么和做什么的意图而设计的,我也不会感到惊讶。也可以看到这条线索:也许他们还在决定。。。