XTubeManager在后台崩溃?

我在XTubeManager中遇到大量的崩溃(似乎是CFNetwork内部)。 不幸的是,控制台日志不可用,只有调用堆栈(见下文)。

问题:

  • 我可以想象,我的应用程序在后台崩溃,因此没有控制台日志被写入,你认为这是一种可能性?
  • 我必须以不同的方式处理backgroundTask过期,例如取消所有的NSURLRequests ? (见下面的代码)

背景

我经常在后台醒来(或通过后台推送)并运行如下所示的后台任务:

 NSString *myTaskName = @"some.random.task.name"; __block UIBackgroundTaskIdentifier taskID = [UIApplication.sharedApplication beginBackgroundTaskWithName:myTaskName expirationHandler:^{ [UIApplication.sharedApplication endBackgroundTask:taskID]; taskID = UIBackgroundTaskInvalid; }]; dispatch_queue_t q = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_async(q, // doing some NSURLRequests stuff here [UIApplication.sharedApplication endBackgroundTask:taskID]; taskID = UIBackgroundTaskInvalid; }); 

这通常在applicationDidEnterBackground调用

调用堆栈

 Thread : Crashed: com.apple.NSURLConnectionLoader 0 libobjc.A.dylib 0x183599b90 objc_msgSend + 16 1 CFNetwork 0x184513300 XTubeManager::withTubeManager(CoreSchedulingSet const*, void (GlueTubeManager*) block_pointer) + 96 2 CFNetwork 0x18451149c -[__NSURLSessionLocal _withConnectionCache_enqueueRequest:forProtocol:scheduling:options:] + 128 3 CFNetwork 0x1845c3798 HTTPProtocol::asynchronouslyCreateAndOpenStream_WithMessage_AfterCookiesAndAuthenticatorHeaders(__CFHTTPMessage*) + 2000 4 CFNetwork 0x1845c2ef8 HTTPProtocol::asynchronouslyAddAuthenticatorHeadersAndContinue(__CFHTTPMessage*) + 144 5 CFNetwork 0x1845c4ba4 ___ZN12HTTPProtocol35asynchronouslyAddCookiesAndContinueEP15__CFHTTPMessage_block_invoke_2 + 28 6 libdispatch.dylib 0x18396d47c _dispatch_client_callout + 16 

NSURLConnection堆栈中的一些对象正在消失。 有些事情要检查:

  • 确保你没有开始连接两次。 (如果你不使用… startImmediately:NO ,那么确保你永远不会打电话start 。)
  • 确保你没有开始连接,然后在连接完成之前释放你的最后一个参考。
  • 确保你没有使用同步NSURLConnection调用(永远)。

除此之外,我曾经见过类似的崩溃,在很多情况下,没有明显的原因。 除非你发现崩溃的频率很高,否则除了提出错误之外,可能没有什么办法可以解决这个问题,并且希望苹果能找出一种方法来解决所有问题。