我正在尝试创建一个应用程序,只要它检测到一个广告预定义服务的新外围设备,它就会唤醒后台模式。我希望唤醒发生,即使用户最小化应用程序,应用程序被暂停,应用程序被用户杀死或应用程序被系统杀死。显然我也希望应用程序被应用程序商店接受(所以不建议添加所有可能的 UIBackgroundModes 等解决方案并在后台永远运行......)。
我可以将 bluetooth-central 添加到 UIBackgroundModes ,因为我的应用符合描述here - 它需要在后台与外围设备通信。< / p>
我找到了一些关于状态保存和恢复的文档here。它描述了一个应用程序连接到蓝牙门锁的情况,并且由于用户远离门,连接中断。根据我的理解,当用户返回门并且iPhone检测到门锁(通过其MAC地址,我猜)时,它会重新连接到门锁并在后台模式中唤醒应用程序(如果我是,请更正我错)。
我不想保留与外围设备的连接(并浪费电池)。我希望应用程序运行 scanForPeripheralWithServices ,当检测到新的外围设备时,它将唤醒应用程序,即使应用程序被用户\系统杀死\暂停。
我在一个不同的问题上找到了一个相关的答案here,说我可以使用kill(getpid(), SIGKILL);
模拟操作系统终止应用,然后,如果我的应用使用状态保存&安培;恢复,它应该醒来(对吗?)。
当我的应用程序检测到新的\旧外围设备时,我希望它创建一个快速连接,读取一些特征并断开连接。不幸的是,iBeacon Monitoring无法提供外围对象(仅限区域)。我知道在我的应用程序进入iBeacon区域后,我可以通过运行 scanForPeripheralsWithServices 来检测外围设备,但这感觉很奇怪 - 直接连续 scanForPeripheralsWithServices 可以在暂停和&amp;杀人,会更有意义。
有什么想法吗?
如果您确定无法做到这一点,并且根据iBeacon Monitoring是唯一的方法,请告诉我。
答案 0 :(得分:0)
问题的关键部分是:
我希望应用程序运行scanForPeripheralWithServices,当检测到新的外围设备时,它将唤醒应用程序,即使应用程序被用户\系统杀死\暂停。
不幸的是,单靠CoreBluetooth
这是不可能的。如果用户杀死某个应用,除非用户再次手动启动该应用,否则它不会从CoreBluetooth
获取新的操作系统启动事件。
幸运的是,CoreLocation
没有此限制。从iOS 7.1开始,它将启动一个被杀死的应用程序来通知它蓝牙信标检测。这将允许您几秒钟的后台运行时间来扫描外围设备。