我正在构建一个应用程序,用户可以从应用程序和共享扩展程序启动后台文件上传。用户应该能够监控主应用程序上传的进度。
如果从扩展程序启动上传,我需要创建一个后台会话配置,该配置具有与扩展程序中使用的相同ID,以便在应用程序中获取委托调用以监控进度等。
在应用程序中,我不能这样做,直到扩展程序退出。 Apple文档说https://developer.apple.com/library/prerelease/content/documentation/Cocoa/Conceptual/URLLoadingSystem/Articles/UsingNSURLSession.html
您必须为每个标识符创建一个会话(当您指定时) 创建配置对象)。多个会话的行为 共享相同的标识符是未定义的。
我已经验证了这一点。如果我不解除共享扩展,我可以在主应用程序中创建会话而没有任何错误,但我没有收到任何委托调用。 当我在切换回主应用程序之前关闭扩展程序时,我可以附加到相同的后台会话,我可以获得委托调用。一切都好。
当我使用completeRequestReturningItems:completionHandler:
中的NSExtensionContext
关闭共享扩展程序时,该进程何时退出?
提到
调用此方法最终会取消应用扩展程序的视图 控制器。
“最终”并不是非常具体。我如何从主应用程序确切知道扩展程序没有运行?
我发现的唯一解决方法是定期在共享容器中写入一个文件,并使主要的upp在超过该时间段的超时后首先获取后台会话。但这是一个丑陋的黑客。
如果上传量很小,那么在扩展程序运行时上传是否有可能完成,以便我必须在扩展程序中而不是在主应用程序中处理上传的完成情况?
总结一下:如何安全地将上传内容从应用扩展程序转移到应用程序?
答案 0 :(得分:2)
Quinn"爱斯基摩人对这类问题进行了一些很好的讨论!" on the old Dev Forums here
与您直接相关的部分是
在我的测试中,我注意到一些讨厌的行为不属于这种设计:如果你从扩展程序启动任务,那么应用程序或扩展程序是否获得didCompleteWithError回调是不确定的。如果任务超级快速运行,则扩展通常会获得回调。如果任务需要更长时间,系统将有时间终止扩展,并恢复应用程序以处理它。
真的没办法解决这个问题。解决方法是在应用程序和扩展中放置处理请求完成的代码(可能通过框架重用代码)。
如果扩展在启动请求后立即断开会话,那将是很好的。唉,目前还不行(rdar:// problem / 18748008)。以编程方式断开与会话断开连接的唯一方法是使其无效,并取消所有正在运行的任务(-invalidateAndCancel)或等待它们完成(-finishTasksAndInvalidate),这两种方法都不合适。
SOOOOO,
在扩展程序运行时上传是否可能完成,因此我必须在扩展程序中处理上传的完成
是。是的。不要爱你"非确定性"行为?
如何安全地将上传内容从应用扩展程序转移到应用中?
当然听起来你不能。因此,那里有雷达,然后耐心等待修复!