我正在开发iOS应用,使用带背景配置的NSURLSession从相机胶卷上传视频。用户可以排队多个视频以进行上传(队列连续执行)。
单个上传包含:
requestAVAssetForVideo
方法获取PHAsset的AVURLAsset引用。 我可以排队多个视频,这个过程在前台运行良好。他们一个接一个地完成。
但是,如果我排队几个视频,然后背景应用程序。一旦执行到达exportAsynchronouslyWithCompletionHandler:
阶段,它就会停止,直到我再次启动应用程序。 (我知道这是因为我在本地通知中发布调试语句,在锁定屏幕上可见)。
当应用程序落后时,是否可以使用exportAsynchronouslyWithCompletionHandler:
?
编辑1 我在连接到调试器时对此进行了测试,而不是,应用程序从不执行复制命令。但只有当应用程序再次被推出时才这样做。
编辑2
我发布了一个similar question关于使用NSFileManager copyItemAtURL:toURL:error:
是否可行的替代方案(但我看到相同的行为,所以不要认为它)。
答案 0 :(得分:1)
一般情况下,如果您需要一点时间(最多几分钟)即使在用户离开应用程序后完成某些任务,您只需从操作系统请求此操作即可。请参阅后台执行章节中的Executing Finite Length Tasks部分。因此,在调用exportAsynchronouslyWithCompletionHandler
时开始后台任务,并在该方法的完成处理程序中结束它。
如果您还在使用背景NSURLSession
。在这种情况下,如果任务完成时应用程序不在前台,则会调用应用委托的handleEventsForBackgroundURLSession
方法,该方法会传递completionHandler
块。必须:
将提供的completionHandler
保存到handleEventsForBackgroundURLSession
;
使用与原始后台会话相同的背景标识符实例化NSURLSession
;
让会话调用适当的委托方法来完成任务;以及
会话将在完成所有操作后致电URLSessionDidFinishEventsForBackgroundURLSession
,此时您通常会调用我们最初在应用代表中收到的completionHandler
。
在您的情况下,您需要将调用推迟到已保存的completionHandler
,直到完成所有异步exportAsynchronouslyWithCompletionHandler
处理程序。有很多方法可以做到这一点(例如派遣小组等),但希望这说明了这个过程中涉及的活动部分。