我有一个应用程序使用新的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了):我是从与苹果工程师的Twitter交流中获得的,他建议怎么做,我编写了上述实现
关于ios - 如何检查NSData Blob作为NSURLSessionDownloadTask的resumeData有效?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21895853/