当应用程序后台运行时,Objective-c 长时间运行的蓝牙后台服务
Posted
技术标签:
【中文标题】当应用程序后台运行时,Objective-c 长时间运行的蓝牙后台服务【英文标题】:Objective-c long-running background service for bluetooth, when app backgrounded 【发布时间】:2017-07-10 14:33:46 【问题描述】:到目前为止,我似乎无法找到正确的文档、教程或 SO 帖子来为我指明正确的实现……尽管有很多关于这个主题的帖子。
问题
我有一个应用程序可以连接(配对)到我构建的 BT 设备。我想要的是,当用户按下主页按钮或背景应用程序时,我想通过 BT 服务层定期向 BT 设备发送更新。我现在正在 applicationWillResignActive
和 applicationDidEnterBackground
方法中执行此操作(仅触发一次),并且效果很好。问题是我只能执行一次。我在这些方法中启动的任何循环、计时器、后台类型服务,都会很快死掉。
我需要什么
让应用程序在后台持续寻找我的 BT 设备,每 10 秒左右,并向设备发送更新。我首先需要检查以确保应用程序仍然在后台,但是一旦我知道它在后台,我想发送更新。当应用重新获得焦点时,我可以停止对 BT 设备的更新,但在应用未获得焦点时发送更新至关重要。
研究
我找到了这些 SO 帖子(long-running tasks、background task execution handler、using this in an NSTimer loop... 但它死了)但它们根本没有帮助实施。
【问题讨论】:
你检查过这个吗:***.com/questions/40761722/…。此外,您不能在后台使用 NSTimer,因为它适用于主线程。 @ninjaproger 如何让间隔计时器或某种受控循环在后台运行并将更新发送到我的蓝牙设备? 【参考方案1】:当我写这篇文章时,我对 OBJ-C 还太陌生,并且不太了解具有适当访问级别以在后台触发的委托方法的概念(即 bluetooth-central 下的 info.plist 访问)。
一个月后的最终结果是构建了一个外围设备,可以通过订阅的特征更新在定时循环中唤醒应用程序。应用唤醒后,您有 10 秒的时间来处理刚刚发生的事件,因为我只是保存了设备发布的数据的副本,所以一切都很好。
【讨论】:
以上是关于当应用程序后台运行时,Objective-c 长时间运行的蓝牙后台服务的主要内容,如果未能解决你的问题,请参考以下文章