【发布时间】:2020-06-23 10:54:46
【问题描述】:
我在 crashlytics 上遇到以下崩溃,我无法在我的设备上重现
Fatal Exception: NSGenericException
Task created in a session that has been invalidated
在下面一行
NSURLSessionTask *task = [self.session uploadTaskWithRequest:request fromFile:filePathURL];
[task resume];
[self.session finishTasksAndInvalidate];
我在委托方法中处理了会话失效
- (void)URLSession:(NSURLSession *)session didBecomeInvalidWithError:(NSError *)error {
// Crashlytics logging
[CrashlyticsKit setBoolValue:true forKey:@"URLSession_didBecomeInvalid"];
self.session = [self createNewSession];
}
- (NSURLSession *)CreateSession {
NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:SERVER_URL];
if (@available(iOS 11.0, *)) {
sessionConfig.waitsForConnectivity = YES;
}
return [NSURLSession sessionWithConfiguration:sessionConfig delegate:self delegateQueue:nil];
}
上传新版本后,我仍然遇到同样的崩溃,并且在“didBecomeInvalidWithError”处根本没有 Crashlytics 日志!
知道如何解决这个崩溃吗?
【问题讨论】:
-
didBecomeInvalidWithError曾经被调用了吗?我想我想知道的是:你确定这个方法是在某个真正是 URLSession 委托的对象中实现的吗? — 另外:您是否意识到 URLSession 保留它的委托?这会导致棘手的内存管理问题。你在做什么呢? — 另外,请显示createNewSession。 -
我已经更新了问题并添加了更多代码。请注意,该类是 Singlton,即委托存在于应用程序生命周期中,因为我需要在后台的多种情况下发送文件,而不仅仅是一次。
-
@matt 当我调试应用程序时代码到达
didBecomeInvalidWithError当它稍后完成上传文件时它在尝试上传文件时再次工作但在生产中我遇到了这个崩溃 -
所以您正在开始一项任务并使会话无效(但由于某种原因挂在旧会话引用上)?并且您 100% 确定您不会在该会话中开始其他任务?
-
@Rob 所以你的意思是,只要我在用户使用应用程序时多次使用一个会话(而不仅仅是上传一个文件补丁),那么我不应该使它无效,因为将会使用用于时间线稍后的后续请求
标签: ios objective-c nsurlsession nsurlsessiontask