与共享扩展程序中的/打开包含应用程序进行通信

arc*_*att 10 ios ios8 ios-app-extension

这是我尝试过的没有用的东西:

  • 使用openURL尝试打开包含的应用程序

以下是我所想到的不起作用:

  • 使用本地通知提供包含应用程序的链接(从扩展程序创建本地通知)

以下是我正在考虑的选项:

  • 使用UIDocumentInteractionController和自定义文件扩展名类型来提供指向我的包含应用程序的链接(以及仅包含我的应用程序)
  • 启动"假"NSURL会话以获得以下功能:在iOS中,如果后台任务完成时您的扩展未运行,系统将在后台启动包含应用程序并调用应用程序:handleEventsForBackgroundURLSession:completionHandler:app delegate method .

确认UIDocumentInteractionController在Xcode 6.5中工作,但流程有点不稳定.NSURL的东西应该也可以,但它也有点可疑.有没有人有任何其他的想法让我的包含应用程序从共享扩展打开,或从共享扩展与它通信的想法?

arc*_*att 5

我已经确认NSURLSession方式(上面"考虑"选项下的第二个子弹)确实有效.我还在努力解决一些问题,但这里有基础知识.使用此方法,您确实可以从共享扩展程序中打开您的应用程序.

此方法需要3个主要步骤,如下所示:

  1. 在共享扩展中创建背景NSURLSession.
  2. 开始下载任务.
  3. 调用exit(0).

确保您下载的内容需要足够长的时间,以便在下载任务完成之前终止扩展.

NSString *address = @"https://googledrive.com/host/0B5zObXR9UzgmbFpob2J5eXpjNXc/file3m";
self.mySession = [self configureMySession];
NSURL *url = [NSURL URLWithString:address];
NSURLSessionTask *myTask = [self.mySession downloadTaskWithURL:url];
[myTask resume];
exit(0);
Run Code Online (Sandbox Code Playgroud)

然后,在包含应用程序的UIApplicationDelegate类中,实现

application:handleEventsForBackgroundURLSession:completionHandler: 
Run Code Online (Sandbox Code Playgroud)

方法.在您的扩展程序终止后下载任务完成时,将调用此方法.然后,在这种方法中,你可以打电话

[[UIApplication sharedApplication] openURL:url];
Run Code Online (Sandbox Code Playgroud)

或者在你的应用程序中做一些其他的东西.

此方法的主要问题是扩展终止的时间与包含应用程序启动的时间之间存在延迟.与UIDocumentInteractionController方法相比,此方法的主要优点是不需要额外的用户交互.随着我继续进行实验,将会有更多细节.