当应用程序在后台时,是否可以使用AVAssetExportSession的`exportAsynchronouslyWithCompletionHandler:`方法?

时间:2015-02-27 19:15:36

标签: ios objective-c afnetworking background-process nsurlsession

我正在开发iOS应用,使用带背景配置的NSURLSession从相机胶卷上传视频。用户可以排队多个视频以进行上传(队列连续执行)。

单个上传包含:

  1. 使用PHImageManager的requestAVAssetForVideo方法获取PHAsset的AVURLAsset引用。
  2. 将资源导出到临时目录(因为您无法直接从AVURLAsset的URL上传)。
  3. 使用NSURLSessionUploadTask
  4. 上传资源

    我可以排队多个视频,这个过程在前台运行良好。他们一个接一个地完成。

    但是,如果我排队几个视频,然后背景应用程序。一旦执行到达exportAsynchronouslyWithCompletionHandler:阶段,它就会停止,直到我再次启动应用程序。 (我知道这是因为我在本地通知中发布调试语句,在锁定屏幕上可见)。

    当应用程序落后时,是否可以使用exportAsynchronouslyWithCompletionHandler:

    编辑1 我在连接到调试器时对此进行了测试,而不是,应用程序从不执行复制命令。但只有当应用程序再次被推出时才这样做。

    编辑2 我发布了一个similar question关于使用NSFileManager copyItemAtURL:toURL:error:是否可行的替代方案(但我看到相同的行为,所以不要认为它)。

1 个答案:

答案 0 :(得分:1)

一般情况下,如果您需要一点时间(最多几分钟)即使在用户离开应用程序后完成某些任务,您只需从操作系统请求此操作即可。请参阅后台执行章节中的Executing Finite Length Tasks部分。因此,在调用exportAsynchronouslyWithCompletionHandler时开始后台任务,并在该方法的完成处理程序中结束它。

如果您还在使用背景NSURLSession。在这种情况下,如果任务完成时应用程序不在前台,则会调用应用委托的handleEventsForBackgroundURLSession方法,该方法会传递completionHandler块。必须:

  • 将提供的completionHandler保存到handleEventsForBackgroundURLSession;

  • 使用与原始后台会话相同的背景标识符实例化NSURLSession;

  • 让会话调用适当的委托方法来完成任务;以及

  • 会话将在完成所有操作后致电URLSessionDidFinishEventsForBackgroundURLSession,此时您通常会调用我们最初在应用代表中收到的completionHandler

在您的情况下,您需要将调用推迟到已保存的completionHandler,直到完成所有异步exportAsynchronouslyWithCompletionHandler处理程序。有很多方法可以做到这一点(例如派遣小组等),但希望这说明了这个过程中涉及的活动部分。