NSURLSession:后台崩溃,因为没有调用上传委托

Posted

技术标签:

【中文标题】NSURLSession:后台崩溃,因为没有调用上传委托【英文标题】:NSURLSession: background crash because upload delegates aren't called 【发布时间】:2014-09-25 13:17:11 【问题描述】:

我一直在尝试使用NSURLSession的后台上传,但偶尔会出现这个崩溃

Sep 25 10:01:48 ipad backboardd[29] <Warning>: MyApp[11829] has active assertions beyond permitted time: 
(
    <BKProcessAssertion: 0x166b1770> identifier: com.apple.nsnetworkd.handlesession process: MyApp[11829] permittedBackgroundDuration: 30.000000 reason: backgroundDownload owner pid:8440 preventSuspend  preventThrottleDownUI  preventIdleSleep  preventSuspendOnSleep 
)

调试代码,我发现当崩溃发生时,application: handleEventsForBackgroundURLSession:completionHandler: 方法被调用,在那里我重新创建会话并存储完成处理程序,如Apple Documentation reccomends,但任务端的委托从未被调用,URLSessionDidFinishEventsForBackgroundURLSession: 也不是,这解释了崩溃,因为我在 NSURLSession 委托中处理完上传结束后调用了完成处理程序。

谁能告诉我为什么不召集代表?

【问题讨论】:

我发现很难获得有关后台任务正在做什么的良好信息。您是否查看了设备控制台日志以获取线索?有时会出现错误消息。 是的,我从设备控制台收到了这条消息,xCode debug 防止了这种崩溃的发生,所以我发现调试它的唯一方法是使用 NSLog 和设备控制台 【参考方案1】:

我发现了问题,我的代码中的一个错误导致我有时会调用完成处理程序两次。下次唤醒应用程序时,委托从未被调用,因此完成处理程序也没有被调用,这导致了崩溃

【讨论】:

以上是关于NSURLSession:后台崩溃,因为没有调用上传委托的主要内容,如果未能解决你的问题,请参考以下文章

应用程序启动时偶尔崩溃

NSURLSession 委托未调用

在后台使用 NSURLSession 逐个下载 100 个文件的列表

NSURLSession 后台传输不起作用

NSURLSession 后台任务:避免重复

管理错误时,带有 JSON 数据参数的 NSURLSession 崩溃为零