我如何才能知道何时重新使用另一个进程中的后台NSURLSessionConfigurationID是安全的?
我正在构建一个应用程序,用户可以从该应用程序和一个共享扩展程序启动后台文件上传。用户应该能够监控来自主应用程序的任何上传的进度。
在从扩展启动上载的情况下,我需要使用扩展中使用的相同ID创建后台会话配置,以便在应用程序中获取监控进度和更多内容的委托调用。
在应用程序中,我无法执行此操作,直到扩展程序退出。 苹果公司文档称https://developer.apple.com/library/prerelease/content/documentation/Cocoa/Conceptual/URLLoadingSystem/Articles/UsingNSURLSession.html
您必须为每个标识符恰好创建一个会话(在 创建配置对象)。多个会话的行为 共享同一标识符未定义。
我已经证实了这一点。如果我不关闭共享扩展,我可以在主应用程序中创建会话而不会出现任何错误,但我不会收到任何委托调用。 当我在切换回主应用程序之前关闭扩展时,我可以附加到相同的后台会话,并且我会收到委托调用。一切正常。
当我在NSExtensionContext
中使用completeRequestReturningItems:completionHandler:
关闭共享扩展时,进程何时退出?
https://developer.apple.com/library/ios/documentation/Foundation/Reference/NSExtensionContext_Class/#//apple_ref/occ/instm/NSExtensionContext/completeRequestReturningItems:completionHandler:
提及
调用此方法最终会关闭应用程序扩展的视图 控制器。
"最终"不是很具体。我如何从主应用程序确定扩展未在运行?
我想出的唯一解决办法是定期在共享容器中写入一个文件,并使主UPP在超时时间超过该时间段后首先获得后台会话。但这是一个丑陋的黑客攻击。如果上传很小,是否会在扩展进程运行时完成上传,因此我必须在扩展中而不是在主应用中处理上传的完成?
总结:如何安全地将上传从应用扩展传输到应用?
解决方案
Quinn《The Eskimo!》on the old Dev Forums here对这类问题进行了很好的讨论。
与您直接相关的部分
在我的测试中,我注意到这种设计有一些恼人的行为:如果你从一个扩展启动一项任务,应用或扩展是否获得didCompleteWithError回调是不确定的。如果任务运行得非常快,扩展通常会收到回调。如果任务耗时较长,则系统有时间终止扩展,并且应用程序将继续处理该扩展。
确实没有办法绕过这一点。解决办法是将处理请求完成的代码放在您的应用程序和扩展中(可能通过框架重用代码)。
如果扩展可以在启动其请求后立即断开与会话的连接,那就太好了。唉,这目前是不可能的(RDAR://Problem/18748008)。以编程方式断开与会话的连接的唯一方法是使其无效,并且要么取消所有正在运行的任务(-invaliateAndCancel),要么等待它们完成(-finishTasksAndInvalify),这两种方法都不适用。
太好了,
是否可能在扩展进程运行时上载完成,因此我必须处理扩展中上载的完成
是的。是的,是这样的。难道你不喜欢"非确定性"行为吗?
如何安全地将上载从应用扩展传输到应用?
听起来你肯定做不到。所以把雷达骗到那里,然后耐心地等待修复!
相关文章