在已失效的会话中创建的任务
Task created in a session that has been invalidated
我在 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 日志!
知道如何解决这个崩溃吗?
如果您使会话无效,您将永远无法再次使用它。如果您尝试使用之前无效的会话,您将收到您与我们分享的错误。
你有两个选择:
如果您必须使会话无效,我建议将您的 session
引用设置为 nil
,这样您就不会不小心再次使用它。如果您稍后必须执行另一个请求,您将实例化一个新的会话对象。
如果您可能需要再次使用该会话,您可以简单地避免使其无效。保留单个会话对象对内存的影响在很大程度上是无关紧要的。如果您要创建很多会话,这才是真正的问题。
坦率地说,后台会话非常复杂,我需要一个非常有说服力的案例来处理多个会话(例如,每个都有自己的完成处理程序传递给我的应用程序委托)。如果可能的话,我会倾向于单一后台会话模式。
我在 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 日志!
知道如何解决这个崩溃吗?
如果您使会话无效,您将永远无法再次使用它。如果您尝试使用之前无效的会话,您将收到您与我们分享的错误。
你有两个选择:
如果您必须使会话无效,我建议将您的
session
引用设置为nil
,这样您就不会不小心再次使用它。如果您稍后必须执行另一个请求,您将实例化一个新的会话对象。如果您可能需要再次使用该会话,您可以简单地避免使其无效。保留单个会话对象对内存的影响在很大程度上是无关紧要的。如果您要创建很多会话,这才是真正的问题。
坦率地说,后台会话非常复杂,我需要一个非常有说服力的案例来处理多个会话(例如,每个都有自己的完成处理程序传递给我的应用程序委托)。如果可能的话,我会倾向于单一后台会话模式。