ios - 从 iOS 共享扩展打开包含应用程序

标签 ios ios8 ios-app-extension

<分区>

以下是我尝试过但没有奏效的方法:

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

这是我认为行不通的方法:

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

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

  • 使用 UIDocumentInteractionController 和自定义文件扩展名类型来提供指向我的包含应用程序(并且仅限我的包含应用程序)的链接
  • 启动“假”NSURL session 以获得以下功能:在 iOS 中,如果您的扩展程序在后台任务完成时未运行,系统会在后台启动您的包含应用程序并调用 application:handleEventsForBackgroundURLSession:completionHandler:应用委托(delegate)方法。

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

最佳答案

我已经确认 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);

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

application:handleEventsForBackgroundURLSession:completionHandler: 

方法。当您的扩展终止后下载任务完成时,将调用此方法。然后,在这个方法中,你可以调用

[[UIApplication sharedApplication] openURL:url];

或者在您的包含应用程序中做一些其他的事情。

此方法的主要问题是扩展程序终止时间与包​​含的应用程序启动时间之间存在延迟。与 UIDocumentInteractionController 方法相比,此方法的主要优点是不需要额外的用户交互。更多细节将在我继续试验时公布。

关于ios - 从 iOS 共享扩展打开包含应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25254700/

相关文章:

c++ - 'ACTION' 的 Swift 编译器错误重新定义

iOS 8 : options for presenting Action Extensions to users?

ios - 如何获取iCarousel当前可见 View ?

ios - 我想知道为什么 UIImagePickerController 裁剪正方形有轻微的偏移,以及如何修复它

ios - 如何以编程方式使用 iOS 语音合成器? (文字转语音)

ios - 在 Swift 中调用 webAPI & fatal error : dictionary literal contains duplicate keys

ios - 无法从iOS 10中的App组共享容器中获取扩展应用程序中的图像

iOS 8 Today 界面生成器

iphone - ViewDidLoad() 中的调用方法

ios - Firebase & JSQMessagesViewController 在 Ios Swift 2 中的一对一聊天