在已失效的会话中创建的任务

Mah*_*dam 5 objective-c ios nsurlsession nsurlsessiontask

我在 crashlytics 上遇到以下崩溃,但无法在我的设备上重现

Fatal Exception: NSGenericException
Task created in a session that has been invalidated
Run Code Online (Sandbox Code Playgroud)

在下一行

NSURLSessionTask *task = [self.session uploadTaskWithRequest:request fromFile:filePathURL];
[task resume];
[self.session finishTasksAndInvalidate];
Run Code Online (Sandbox Code Playgroud)

我在委托方法中处理了会话失效

- (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];
}
Run Code Online (Sandbox Code Playgroud)

上传新版本后,我仍然遇到相同的崩溃,并且didBecomeInvalidWithError根本没有“”处的 Crashlytics 日志!

知道如何解决这个崩溃吗?

Rob*_*Rob 1

如果您使会话无效,您将无法再次使用它。如果您尝试使用以前无效的会话,您\xe2\x80\x99将收到您与我们分享的错误。

\n\n

这给你留下了两个选择:

\n\n
    \n
  • 如果您必须使会话无效,我\xe2\x80\x99d 建议将您的session引用设置为nil,以便您\xe2\x80\x99d 不会意外地再次使用它。如果稍后必须执行另一个请求,您将实例化一个新的会话对象。

  • \n
  • 如果您可能需要再次使用该会话,您可以简单地避免使其失效。保留单个会话对象对内存的影响在很大程度上是无关紧要的。只有当您\xe2\x80\x99 创建许多会话时,这才是真正的问题。

  • \n
\n\n

坦率地说,后台会话足够复杂,以至于我\xe2\x80\x99d 需要一个非常引人注目的案例来处理多个会话(例如,每个会话都有自己的完成处理程序传递给我的应用程序委托)。如果可能的话,I\xe2\x80\x99d 倾向于单一后台会话模式。

\n