【问题标题】:Why does connecting back to an iOS background NSURLSession take too long waiting on a lock, crashing the app?为什么连接回 iOS 后台 NSURLSession 等待锁定时间过长,导致应用程序崩溃?
【发布时间】:2014-09-05 05:39:53
【问题描述】:

为什么通过它的配置连接一个 NSURLSession 需要很长时间,以至于它会在启动时崩溃应用程序:'未能及时启动'?

我在许多 iOS 应用程序中看到过类似的崩溃转储,包括 NY Times iOS 应用程序和 Evernote 应用程序。

[NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:queue]

这是堆栈跟踪:

Thread 0:
0   libsystem_kernel.dylib          0x3afb7aa0 semaphore_wait_trap + 8
1   libdispatch.dylib               0x3af04d3d _dispatch_semaphore_wait_slow + 173
2   CFNetwork                       0x2febd8e3 -[__NSCFBackgroundSessionBridge setupBackgroundSession] + 379
3   CFNetwork                       0x2fef18a1 +[__NSCFSessionBridge bridgeForConfiguration:session:queue:] + 153
4   CFNetwork                       0x2fef6497 -[__NSCFURLSession initWithConfiguration:delegate:delegateQueue:] + 395
5   CFNetwork                       0x2fef6eb7 +[__NSCFURLSession sessionWithConfiguration:delegate:delegateQueue:] + 295

【问题讨论】:

  • 我也面临同样的堆栈跟踪问题。无法找出根本原因。 @Rayyan,你能解决这个问题吗?
  • 我将调用移动到在后台线程上异步运行,以便操作系统不会因此而终止应用程序。但是,sessionWithConfiguration 调用随后会挂起并且永远不会返回。它很少发生,但是一旦设备进入不良状态,它就会一直挂在该设备上。 @kkumpavat,这也是你所看到的吗?我怀疑这是 iOS 中的错误。
  • 是的,我也怀疑它是 iOS 中的一个错误。它很少发生,一旦 iOS 进入那种糟糕的状态,每次执行都会挂在 'sessionWithConfiguration:delegate:delegateQueue:' 处。此外,将调用移动到异步运行也无济于事,因为会话永远不会被初始化,我们将无法执行网络任务。
  • 我似乎在 iOS 8.3 上也遇到了这个问题。您是否曾经制定过解决方案或解决方法?我想我可能只是在后台队列中执行此操作,因为我不需要在启动时立即使用它。
  • 我在 iOS 8.3 上也有这个问题(以前在 8.2 上可以正常工作)。基本上,如果我正在进行大文件后台上传并且应用程序被终止,它将始终在重新启动时挂起,直到我重新启动设备。我目前的解决方法是在 NSUserDefaults 中存储一些标志,并在收到 URLSessionDidFinishEventsForBackgroundURLSession 通知时重置它们。之后,调用 sessionWithConfiguration 是安全的。您可能永远不会收到通知,并且我的标志将永久禁用该服务。

标签: ios objective-c crash nsurlsession


【解决方案1】:

Application Specific Information: Application failed to launch in time (iOS)?

基本上有两点要记住:

  1. 启动时,您只有几秒钟的时间来完成启动过程。应用启动后,应异步调用任何运行时间较长的代码。

  2. 确保在主线程中调用回调/块/闭包/等中的任何 UI 代码。你必须强迫它这样做。

【讨论】:

  • @henry-asseily,谢谢,这是有道理的,我同意你的指导方针。我不清楚为什么 sessionWithConfiguration:delegate:delegateQueue: API 需要很长时间,它需要是异步的,这样它就不会在启动时阻止应用程序。该 API 的语义并不表明它可能是一个长时间运行的调用,但也许我遗漏了一些东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多