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

标签 ios objective-c afnetworking background-process nsurlsession

我正在开发一个 iOS 应用程序,使用具有后台配置的 NSURLSession 从相机胶卷上传视频。用户可以将多个视频排队上传(队列是串行执行的)。

单个上传内容包括:

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

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

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

当应用程序处于后台时是否可以使用copyItemAtURL:toURL:error:

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

编辑 1 我在连接到调试器时对此进行了测试,虽然没有连接,但应用程序从不执行复制命令。但仅当应用程序再次置于前台时才会执行此操作。

编辑 2 澄清一下,执行在复制命令处停止。它不会产生错误并继续执行。实现 fileManager:shouldCopyItemAtURL:toURL: 委托(delegate)方法不会改变任何事情。该方法的文档还说:

Prior to copying each item, the file manager asks its delegate if it should actually do so. It does this by calling the fileManager:shouldCopyItemAtURL:toURL: method; if that method is not implemented (or the process is running in OS X 10.5 or earlier) it calls the fileManager:shouldCopyItemAtPath:toPath: method instead. If the delegate method returns YES, or if the delegate does not implement the appropriate methods, the file manager proceeds to copy the file or directory.

最佳答案

您获得的 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

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

关于ios - 应用程序在后台时是否可以使用 NSFileManager 的 `copyItemAtURL:toURL:error:` 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28769710/

相关文章:

objective-c - 如何使图像覆盖下的控件可点击?

iOS:带有图像错误的 CollectionView

ios - 通过 AFNetworking 中的参数的对象数组

iOS AFNetworking 阻塞主线程

ios - 如何使用 AFnetworking 发送 post 请求?

ios - 通过 NSLog 打印 NSError 总是引发 EXE_BAD_ACCESS

html - Swift:在标签中显示 HTML 数据不显示正确的图像

objective-c - 如何检查设备是否为Ipad mini

c++ - 在 iOS 中使用 Objective-C 背后的理念是什么?为什么不是 C++?

objective-c - NSURLErrorDomain : Cannot decode raw data