以下是我尝试过但没有奏效的方法:
这是我认为行不通的方法:
- 使用本地通知提供指向包含应用程序的链接(从扩展创建本地通知)
以下是我正在考虑的选项:
- 使用 UIDocumentInteractionController 和自定义文件扩展名类型来提供指向我的包含应用程序(并且仅限我的包含应用程序)的链接
- 启动“假”NSURL session 以获得以下功能:在 iOS 中,如果您的扩展程序在后台任务完成时未运行,系统会在后台启动您的包含应用程序并调用 application:handleEventsForBackgroundURLSession:completionHandler:应用委托(delegate)方法。
UIDocumentInteractionController 已确认可在 Xcode 6.5 中工作,但流程有点不稳定。 NSURL 应该也能工作,但它也有点可疑。有没有人有任何其他想法让我的包含应用程序从共享扩展打开,或者有想法从共享扩展与之通信?
我已经确认 NSURLSession 方式(上面“正在考虑”选项下的第二个项目符号)确实有效。我仍在解决一些问题,但这是基础知识。使用此方法,您确实可以从共享扩展程序打开您的应用程序。
此方法需要3个主要步骤,如下:
- 在共享扩展中创建一个后台 NSURLSession。
- 开始下载任务。
- 调用 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);
然后,在包含应用程序的 UIApplicationDelegate 类中,实现
application:handleEventsForBackgroundURLSession:completionHandler:
方法。当您的扩展终止后下载任务完成时,将调用此方法。然后,在这个方法中,你可以调用
[[UIApplication sharedApplication] openURL:url];
或者在您的包含应用程序中做一些其他的事情。
此方法的主要问题是扩展程序终止时间与包含的应用程序启动时间之间存在延迟。与 UIDocumentInteractionController 方法相比,此方法的主要优点是不需要额外的用户交互。更多细节将在我继续试验时公布。