iOS 18下发送网络请求时APP崩溃问题求助
问题概述
APP在iOS 18系统下发送网络请求时触发崩溃,该请求此前可在iOS 18环境正常运行。
崩溃代码
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; configuration.URLCache = [[NSURLCache alloc] initWithMemoryCapacity:20 * 1024 * 1024 diskCapacity:100 * 1024 * 1024 diskPath:@"myCache"]; if (!configuration) { NSLog(@"Failed to create session configuration."); return; } NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration]; if (!session) { NSLog(@"Failed to create session."); return; } NSURL *url = [NSURL URLWithString:@"https://example.com"]; if (!url) { NSLog(@"Invalid URL."); return; } NSURLRequest *request = [NSURLRequest requestWithURL:url]; if (!request) { NSLog(@"Failed to create request."); return; } NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { if (error) { NSLog(@"Error: %@", error.localizedDescription); } else { NSLog(@"Data received: %@", data); } }]; if (!dataTask) { NSLog(@"Failed to create data task."); return; } dataTask.priority = NSURLSessionTaskPriorityDefault; [dataTask resume];
错误日志
因未捕获异常'NSInvalidArgumentException'导致APP终止,原因:'*** -[NSFileManager createDirectoryAtURL:withIntermediateDirectories:attributes:error:]: URL 为 nil'
*** 首次抛出调用栈:
(0x1848bd08c 0x181bbf2e4 0x183585f48 0x185d2f2bc 0x185d2ec7c 0x10709271c 0x1070a3f04 0x185d2ea88 0x185d2db20 0x185d2d5f4 0x185d2d07c 0x185d274b0 0x185dd82c4 0x185dd8214 0x185dd730c 0x107090a30 0x10709271c 0x10709a5e8 0x10709b394 0x10709cb20 0x1070a85f0 0x1070a7c00 0x20bc27c7c 0x20bc24488)
libc++abi: 因未捕获NSException类型异常而终止
原因分析
崩溃根源在于初始化NSURLCache时传入的diskPath:@"myCache"参数。iOS 18对NSURLCache的磁盘路径处理逻辑做了变更,直接传入相对路径会导致系统无法正确生成缓存目录的URL,最终调用NSFileManager创建目录时因URL为nil触发非法参数异常。
解决方案
方案1:使用系统默认缓存目录
如果不需要自定义缓存目录路径,直接省略diskPath参数,让系统自动处理缓存目录:
configuration.URLCache = [[NSURLCache alloc] initWithMemoryCapacity:20 * 1024 * 1024 diskCapacity:100 * 1024 * 1024 diskPath:nil];
方案2:指定自定义绝对缓存路径
若需自定义缓存目录,先获取应用的缓存目录绝对URL,再拼接自定义路径:
// 获取应用缓存目录 NSURL *cacheDirURL = [[NSFileManager defaultManager] URLForDirectory:NSCachesDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:YES error:nil]; // 拼接自定义缓存路径 NSURL *customCacheURL = [cacheDirURL URLByAppendingPathComponent:@"myCache"]; // 使用绝对路径初始化NSURLCache configuration.URLCache = [[NSURLCache alloc] initWithMemoryCapacity:20 * 1024 * 1024 diskCapacity:100 * 1024 * 1024 diskPath:customCacheURL.path];
内容的提问来源于stack exchange,提问作者J.zone

