应用程序在后台崩溃,而蓝牙连接长时间丢失

Posted

技术标签:

【中文标题】应用程序在后台崩溃,而蓝牙连接长时间丢失【英文标题】:App crashes in background while bluetooth connection lost for long time 【发布时间】:2013-09-11 13:19:46 【问题描述】:

我正在开发一个与蓝牙低功耗设备通信的应用程序。我在 UI 中显示心率。当蓝牙连接时,它在前景和背景中都可以正常工作。但我的问题是,当应用程序处于后台时,蓝牙设备的连接丢失时间更长,我的应用程序崩溃了。将崩溃报告显示为:

MyApp[565] has active assertions beyond permitted time: 

【问题讨论】:

请添加整个错误消息以供将来参考。 【参考方案1】:

Core 蓝牙后台通信必须通过特征更改通知或指示来实现。在被带到后台后,您让应用程序运行太久,而 ios 正在强行杀死它。我想您正在使用beginBackgroundTaskWithExpirationHandler: 方法来保持一些计时器运行。这在很长一段时间内都不起作用。限制为 10 分钟左右,但也可能取决于其他因素。

Core Bluetooth Programming Guide 包含一个关于如何处理背景的非常简洁的描述。实际上,您的应用需要订阅心率特征的通知或指示,并仅在回调发生时对其做出反应。只有当应用程序正在执行一些不可中断的任务时,应用程序才应在后台保持运行,例如不可恢复的网络操作。

【讨论】:

【参考方案2】:

我假设您使用的是 iOS 6.1

您是否使用 CBCentralManager 的以下委托方法处理设备断开连接

– centralManager:didDisconnectPeripheral:error:
– centralManager:didFailToConnectPeripheral:error:

我也怀疑在后台时没有设备发现,所以您可能必须在代码中处理该逻辑

【讨论】:

是的,我正在开发 iOS 6.1 和 iOS 7 beta 6。我使用这些委托方法断开连接。你能建议我使用什么样的逻辑来让我的应用程序在后台运行吗? 为了让应用程序在后台保持活跃,您需要将以下设置添加到项目 bluetooth-central 或 bluetooth-peripheral 的 info.plist 中的 UIBackgroundModes 中,文档中非常清楚地提到了

以上是关于应用程序在后台崩溃,而蓝牙连接长时间丢失的主要内容,如果未能解决你的问题,请参考以下文章

C# 如何防止在长时间运行的查询期间因崩溃而丢失数据?

是啥导致应用程序在后台长时间运行后在恢复时崩溃?

iPad长时间待机之后,不重启就无法连接罗技蓝牙键盘,是怎么回事?

Elixir 长时间运行的后台任务未完成,有时会崩溃

在 iOS 中实现长时间运行的后台任务

为啥我的长时间运行的 python 脚本在运行大约 3 天后会因“无效指针”而崩溃?