当应用程序在后台时,是否可以使用NSFileManager的`copyItemAtURL:toURL:error:`方法?

时间:2015-02-27 16:25:53

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

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

单个上传包含:

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

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

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

    当应用程序落后时,是否可以使用copyItemAtURL:toURL:error:

    如果没有,是否可以使用AVAssetExportSession?

    编辑1 我连接到调试器时测试了这个,但没有,应用程序永远不会执行复制命令。但只有当应用程序再次被推出时才这样做。

    编辑2 为了澄清,执行在复制命令停止。它不会产生错误并继续执行。实现fileManager:shouldCopyItemAtURL:toURL:委托方法并不会改变事情。该方法的文档也说:

      

    在复制每个项目之前,文件管理器会询问其代理是否正确   应该这样做。它是通过调用来实现的   fileManager:shouldCopyItemAtURL:toURL:method;如果那种方法不是   实现(或者该进程在OS X 10.5或更早版本中运行)   调用fileManager:shouldCopyItemAtPath:toPath:方法。如果   委托方法返回YES,或者委托方法没有实现   适当的方法,文件管理器继续复制文件或   。目录

1 个答案:

答案 0 :(得分:1)

您为AVURLAsset获得了哪种URL?有两个,区别总是相关的(采用UIImagePickerController生成的URL与AVAssetReader / Writer使用的URL:

我可以用这个证明:

[[PHImageManager defaultManager] requestAVAssetForVideo:phAsset options:nil resultHandler:^(AVAsset *avAsset, AVAudioMix *audioMix, NSDictionary *info) {
    NSURL *url = (NSURL *)[[(AVURLAsset *)avAsset URL] fileReferenceURL];
    NSLog(@"url = %@", [url absoluteString]);
    NSLog(@"url = %@", [url relativePath]);
 }];

虽然phAsset是PHAsset对象,而avAsset是由PHImageManager生成的结果AVAsset对象,但从上面的代码输出到控制台将产生,例如:

2016-04-16 01:15:40.155 ChromaEpsilon[3423:933358] url = file:///.file/id=16777218.8262005
2016-04-16 01:15:40.155 ChromaEpsilon[3423:933358] url = /private/var/mobile/Media/DCIM/108APPLE/IMG_8421.MOV

我相信,不仅仅是这两个,而是从这里开始。