当应用程序在后台时,是不是可以使用 NSFileManager 的 `copyItemAtURL:toURL:error:` 方法?
Posted
技术标签:
【中文标题】当应用程序在后台时,是不是可以使用 NSFileManager 的 `copyItemAtURL:toURL:error:` 方法?【英文标题】:Is it possible to use NSFileManager's `copyItemAtURL:toURL:error:` method when the app is in the background?当应用程序在后台时,是否可以使用 NSFileManager 的 `copyItemAtURL:toURL:error:` 方法? 【发布时间】:2015-02-27 16:25:52 【问题描述】:我正在开发一个 ios 应用程序,使用带有后台配置的 NSURLSession 从相机胶卷上传视频。用户可以将多个视频排队上传(队列是串行执行的)。
单个上传包括:
-
使用 PHImageManager 的
requestAVAssetForVideo
方法获取对 PHAsset 的 AVURLAsset 引用。
将资源复制到临时目录(因为您无法直接从 AVURLAsset 的 URL 上传)。
使用 NSURLSessionUploadTask 上传资源
我可以将多个视频排队,并且该过程在前台运行良好。他们一个接一个地完成。
但是,如果我将几个视频排队,然后将应用程序置于后台。一旦执行到达copyItemAtURL:toURL:error:
阶段,它就会停止,直到我再次将应用程序置于前台。 (我知道这一点是因为我在本地通知中发布调试语句,在锁定屏幕上可见)。
在后台运行时是否可以使用copyItemAtURL:toURL:error:
?
如果没有,是否可以使用 AVAssetExportSession 代替?
编辑 1 我在连接到调试器时对此进行了测试,虽然没有,但该应用程序从不执行复制命令。但只有当应用程序再次被前台显示时才会这样做。
编辑 2
为了澄清,执行在复制命令处停止。它不会产生错误并继续执行。并且实现fileManager:shouldCopyItemAtURL:toURL:
委托方法不会改变任何事情。该方法的文档还说:
在复制每个项目之前,文件管理器会询问其委托人是否 实际上应该这样做。它通过调用 文件管理器:shouldCopyItemAtURL:toURL:方法;如果该方法不是 已实现(或进程在 OS X 10.5 或更早版本中运行) 改为调用 fileManager:shouldCopyItemAtPath:toPath: 方法。如果 委托方法返回 YES,或者如果委托没有实现 适当的方法,文件管理器继续复制文件或 目录。
【问题讨论】:
你有没有实现shouldCopyItemAtURL
?
不,但在使用defaultFileManager
时,这不是必需的,是吗?现在就试试看……
刚刚更新了问题,似乎没有帮助...
【参考方案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
我相信不止这两个,但从这里开始。
【讨论】:
以上是关于当应用程序在后台时,是不是可以使用 NSFileManager 的 `copyItemAtURL:toURL:error:` 方法?的主要内容,如果未能解决你的问题,请参考以下文章
iPhone:当用户单击主页按钮时,是不是可以关闭应用程序而不是在后台运行?
当应用程序在后台或在本机反应中被杀死时,是不是可以检查用户的移动活动?
当 Healthkit 在后台唤醒我的应用程序时,AppDelegate 是不是会初始化?