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

我正在开发iOS应用程序,从相机胶卷上传video,使用NSURLSession进行背景configuration。 用户可以排队上传多个video(串行执行队列)。

一次上传包括:

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

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

但是,如果我排队了几个video,然后背景的应用程序。 只要执行到达copyItemAtURL:toURL:error:阶段,它就会停止,直到我再次前台应用程序。 (我知道这是因为我在本地通知中发布debugging语句,在locking屏幕上可见)。

是否有可能使用copyItemAtURL:toURL:error:当应用程序背景?

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

编辑1我已经testing了这个连接到debugging器,而不是,应用程序从不执行复制命令。 但是只有当应用程序再次被预先登陆时才这样做。

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

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

你为AVURLAsset获得什么types的URL? 有两个,区别总是相关的(采用由UIImagePickerController生成的URL与由AVAssetReader / Writer使用的URL:

我可以用这个certificate:

 [[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 

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