我有一个应用程序使用新的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.

错误在这里发生,其中resumeDataNSData blob,而sessionNSURLSession的实例:
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/

10-13 07:18