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