ios - 在后台,可以在应用程序运行时使用NSFileManager方法的`copyItemAtURL:toURL:error:`?

  显示原文与译文双语对照的内容
67 3

我正在使用iOS应用程序,从相机卷上传视频,使用NSURLSession和后台配置。用户可以排队多个视频上传( 队列按顺序执行) 。

单一上传包括:

  • 使用PHImageManager方法 requestAVAssetForVideo 获取PHAsset的AVURLAsset引用。
  • 将资源复制到AVURLAsset的临时目录( 因为你不能直接从网址上上传) 。
  • 使用NSURLSessionUploadTask上载资源

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

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

当应用程序为backgrounded时是否可以使用 copyItemAtURL:toURL:error:

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

编辑 1 我在连接到调试器时进行测试,而不是,应用程序从不执行复制命令。但这样做只是当应用再次提升时。

编辑 2 以阐明,在复制命令处执行停顿。它不会产生错误并继续执行。并实现fileManager:shouldCopyItemAtURL:toURL:委托方法不更改内容。方法的文档还说明:

在复制每个项目之前,文件管理器会询问它的委托是否应该实际这样做。它通过调用 filemanager: shouldcopyitematurl: ulink来实现这一点:如果该方法未实现,则( 或者进程在 OS X 10.5或者更早版本中运行) 将调用 filemanager: shouldcopyitematpath: toPath:方法。如果委托方法返回是,或者者委托没有实现相应的方法,文件管理器将继续复制文件。

时间:原作者:0个回答

117 4

你对AVURLAsset的网址是什么?有两个,区别总是相关( 采用由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

我相信不止这两个,但从这里开始。

原作者:
...