1

我正在构建一个应用程序,用户可以在其中从应用程序和共享扩展启动后台文件上传。用户应该能够监控从主应用程序上传的任何进度。

在从扩展程序启动上传的情况下,我需要创建一个后台会话配置,其 id 与扩展程序中使用的相同,以获取委托调用以监控应用程序中的进度等。

在应用程序中,直到扩展程序退出,我才能执行此操作。苹果文档说https://developer.apple.com/library/prerelease/content/documentation/Cocoa/Conceptual/URLLoadingSystem/Articles/UsingNSURLSession.html

您必须为每个标识符创建一个会话(在创建配置对象时指定)。共享同一标识符的多个会话的行为是未定义的。

我已经验证了这一点。如果我不关闭共享扩展,我可以在主应用程序中创建会话而不会出现任何错误,但我不会收到任何委托调用。当我在切换回主应用程序之前关闭扩展程序时,我可以附加到同一个后台会话并收到委托呼叫。都好。

completeRequestReturningItems:completionHandler:当我使用in关闭共享扩展NSExtensionContext时,进程何时退出?

https://developer.apple.com/library/ios/documentation/Foundation/Reference/NSExtensionContext_Class/#//apple_ref/occ/instm/NSExtensionContext/completeRequestReturningItems:completionHandler

提到

调用此方法最终会关闭应用扩展的视图控制器。

“最终”不是很具体。我如何从主应用程序中确定扩展程序没有运行?

我想出的唯一解决方法是定期在共享容器中写入一个文件,并在超过该时间段的超时后让主upp首先拿起后台会话。但这是一个丑陋的黑客。

如果上传很小,是否有可能在扩展进程运行时上传完成,以便我必须在扩展而不是主应用程序中处理上传的完成?

总结一下:您如何安全地将上传从应用程序扩展传输到应用程序?

4

1 回答 1

3

奎因“爱斯基摩人”对这类问题进行了很好的讨论。在旧的开发论坛上

与您直接相关的部分是

在我的测试中,我注意到这种设计中出现了一些令人讨厌的行为:如果您从扩展程序启动任务,则应用程序或扩展程序是否获得 didCompleteWithError 回调是不确定的。如果任务运行得非常快,扩展通常会收到回调。如果任务需要更长的时间,系统有时间终止扩展并恢复应用程序来处理它。

真的没有办法解决这个问题。解决方法是将处理请求完成的代码放在您的应用程序和扩展程序中(可能通过框架重用代码)。

如果扩展程序可以在开始请求时立即断开会话,那就太好了。唉,这目前是不可能的(rdar://problem/18748008)。以编程方式断开会话的唯一方法是使其无效,并且取消所有正在运行的任务(-invalidateAndCancel)或等待它们完成(-finishTasksAndInvalidate),这两种方法都不合适。

太棒了,

是否有可能在扩展进程运行时完成上传,所以我必须在扩展中处理上传的完成

是的。是的。你不喜欢“非确定性”的行为吗?

您如何安全地将上传从应用程序扩展传输到应用程序?

当然听起来你不能。所以欺骗那里的雷达,然后耐心等待修复!

于 2016-07-05T18:36:58.843 回答