- objective-c - iOS 5 : Can you override UIAppearance customisations in specific classes?
- iphone - 如何将 CGFontRef 转换为 UIFont?
- ios - 以编程方式关闭标记的信息窗口 google maps iOS
- ios - Xcode 5 - 尝试验证存档时出现 "No application records were found"
我有一个应用程序使用新的 NSURLSession
API 进行后台下载。当下载取消或以提供 NSURLSessionDownloadTaskResumeData
的方式失败时,我会存储数据 blob,以便稍后可以恢复。在极少数情况下,我注意到在野外发生崩溃:
Fatal Exception: NSInvalidArgumentException
Invalid resume data for background download. Background downloads must use http or https and must download to an accessible file.
错误发生在这里,其中 resumeData
是 NSData
blob,session
是 NSURLSession
的实例:
if (resumeData) {
downloadTask = [session downloadTaskWithResumeData:resumeData];
...
数据由 Apple API 提供,经过序列化,然后在稍后的某个时间点反序列化。它可能已损坏,但它永远不会为零(如 if 语句检查的那样)。
如何提前检查 resumeData
是否无效,以免应用崩溃?
最佳答案
这是 Apple 建议的解决方法:
- (BOOL)__isValidResumeData:(NSData *)data{
if (!data || [data length] < 1) return NO;
NSError *error;
NSDictionary *resumeDictionary = [NSPropertyListSerialization propertyListWithData:data options:NSPropertyListImmutable format:NULL error:&error];
if (!resumeDictionary || error) return NO;
NSString *localFilePath = [resumeDictionary objectForKey:@"NSURLSessionResumeInfoLocalPath"];
if ([localFilePath length] < 1) return NO;
return [[NSFileManager defaultManager] fileExistsAtPath:localFilePath];
}
编辑(iOS 7.1 不再是 NDA'd):我从 Twitter 与苹果工程师的交流中得到这个,他建议做什么,我写了上面的实现
关于ios - 如何检查 NSData blob 作为 NSURLSessionDownloadTask 的 resumeData 是否有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21895853/
我在使用 NSURLSessionDownloadTask 处理 ios 上的“空间不足”/“磁盘已满”错误时遇到问题 如果由于应用程序中完成下载而导致磁盘已满,我会接到电话 URLSession(
我使用NSURLSessionDownloadTask从服务器下载文件,该文件在后台 session 中运行。我想保存恢复数据以在应用终止时恢复下载。但是,对cancelByProducingResu
我有一个主机应用程序,它有一个完美运行的后台下载 session ,但是通过今天的扩展启动下载我得到这个错误: The operation couldn’t be completed. (NSURLE
我是 NSURLSession 的新手,我没有在其他 stackoverflow 问题中找到答案。所以我发布这个。 我的 ViewController 中有一个 Button 和 ProgressBa
我有以下一段代码,它已经工作了几个月,并且刚刚开始间歇性地损坏。 我正在改变它被调用的方式,所以这并不完全不足为奇,但症状让我感到困惑。某些请求正在下载的临时文件似乎在读取数据之前被删除。 我有关于文
我正在使用 NSURLSessionDownloadTask 下载文件。在应用程序的某一时刻,有必要暂停下载一小段时间,然后再继续下载。我尝试使用暂停方法暂停下载,但任务继续下载。 NSURLSess
有人可以帮我把这个语句翻译成 Swift 吗? NSURLSessionDownloadTask *task = [session downloadTaskWithRequest:request
使用 NSURLSessionDownloadTask 连续下载文件列表的最佳做法是什么? 例如,是否最好在上一次下载完成后开始一个新的 NSURLSession? - (void)startDown
我需要按顺序下载文件。目前我可以在应用程序处于前台时执行此操作。 以下是我使用的逻辑。 创建所有下载任务。 一次恢复一个,当前完成后从 URLSession:task:didCompleteWithE
我正在使用 nsurlsession 来管理下载图像/视频文件。问题是有时请求会出错并返回“找不到内容”之类的文本。我如何确保正在下载的文件确实是我请求的文件类型? (例如 .jpeg 或 .mp4)
我添加“下载任务”并终止应用进程。 运行app后,获取[manager downloadTasks];并恢复所有。但文件未加载到 Documets 目录中。 我使用 AFNetworking 2.0
这就是我使用 NSURLSessionDownloadTask 的方式: let sessionConfiguration = NSURLSessionConfiguration.defaul
我的 iOS 应用程序使用 NSURLSessionConfiguration、NSURLSession、NSURLSessionDownloadTask 等来下载我们的服务器从数据库中动态生成的 x
我想知道我是否可以检索失败的 NSURLSessionDownloadTask 的部分下载数据。 我的用例是: 我开始下载一个 1024MB 的文件 已下载 512MB 网络中断下载失败 下载失败时,
我需要使用桌面应用程序下载文件。首先,我创建了一个简单的iOS项目,用于下载视频文件,引用这个web site 。有用。我想为 macOS 做几乎同样的事情。 class ViewController
我正在使用 NSURLSessionDownloadTask 下载网页文件。当我使用 [NSURLSessionConfiguration backgroundSessionConfiguration
我正在尝试使用 NSURLSessionDownloadTask 下载一个大文件。但是,我只想下载该文件的前 10MB。我知道如何在下载 10MB 后取消操作,但如何强制调用 didFinishDow
在我的应用程序中,我从 Web 服务获取 JSON。此 JSON 包含我要下载的几个文件的网址。 我想使用 NSURLSessionDownloadTask 一个一个地下载每个文件(等待第一个下载完成
我需要从服务器下载一些图片和一段视频: NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSes
在我的应用程序中,我目前正在使用 NSURLSessionDownloadTask通过 HTTP 获取文件。 此类提供了一个有用的委托(delegate)接口(interface)来监控其进度并在通过
我是一名优秀的程序员,十分优秀!