iOS 没有iBeacon监控的蓝牙监控
iOS Bluetooth monitoring without iBeacon monitoring
我正在尝试创建一个应用程序,只要它检测到宣传预定义服务的新外围设备,它就会唤醒到后台模式。我希望即使用户最小化应用程序、应用程序被暂停、应用程序被用户杀死或应用程序被系统杀死,唤醒也会发生。显然我也希望应用程序被应用程序商店接受(所以不要建议像永远在后台添加所有可能的 UIBackgroundModes 和 运行 这样的解决方案......)。
我可以将 bluetooth-central 添加到 UIBackgroundModes 因为我的应用符合描述 here - 它需要通信在后台有外围设备。
我找到了一些关于国家保护和恢复的文档here。它描述了一个应用程序连接到蓝牙门锁的场景,并且由于用户远离门而导致连接中断。据我了解,当用户 returns 到门并且 iPhone 检测到门锁(我想是通过其 MAC 地址)时,它会重新连接到门锁并唤醒后台模式下的应用程序(如果我错了请纠正我)。
我不想保留与外围设备的连接(并浪费其电池)。我希望应用程序 运行 scanForPeripheralWithServices 将在检测到新外围设备时唤醒应用程序,即使应用程序是 killed\suspended user\system.
我找到了另一个问题的相关答案 here,说我可以使用 kill(getpid(), SIGKILL);
模拟应用程序终止 OS 然后,如果我的应用程序使用状态保存和恢复,它应该唤醒(对吧?)。
当我的应用程序检测到 new\old 外围设备时,我希望它创建快速连接、读取一些特征并断开连接。不幸的是,这对于不提供外围对象(仅区域)的 iBeacon 监控是不可能的。我知道我可以在我的应用程序进入 iBeacon 区域后通过 运行ning scanForPeripheralsWithServices 检测外围设备,但这感觉很奇怪 - 直接连续 scanForPeripheralsWithServices 在暂停和杀死后幸存下来,会更有意义。
有什么想法吗?
如果您确定这是不可能的,并且依赖 iBeacon 监控是唯一的方法,请告诉我。
问题的关键部分是:
I want the app to run scanForPeripheralWithServices that will wake up the app when a new peripheral is detected, even if the app was killed\suspended by the user\system.
不幸的是,这仅靠 CoreBluetooth
是不可能的。如果用户关闭应用程序,它将不会从 CoreBluetooth
获得新的 OS 启动事件,除非用户再次手动启动该应用程序。
幸好CoreLocation
没有这个限制。从 iOS 7.1 开始,它会启动一个被杀死的应用程序来通知它检测到蓝牙信标。这将使您有几秒钟的后台 运行 时间来扫描外围设备。
我正在尝试创建一个应用程序,只要它检测到宣传预定义服务的新外围设备,它就会唤醒到后台模式。我希望即使用户最小化应用程序、应用程序被暂停、应用程序被用户杀死或应用程序被系统杀死,唤醒也会发生。显然我也希望应用程序被应用程序商店接受(所以不要建议像永远在后台添加所有可能的 UIBackgroundModes 和 运行 这样的解决方案......)。
我可以将 bluetooth-central 添加到 UIBackgroundModes 因为我的应用符合描述 here - 它需要通信在后台有外围设备。
我找到了一些关于国家保护和恢复的文档here。它描述了一个应用程序连接到蓝牙门锁的场景,并且由于用户远离门而导致连接中断。据我了解,当用户 returns 到门并且 iPhone 检测到门锁(我想是通过其 MAC 地址)时,它会重新连接到门锁并唤醒后台模式下的应用程序(如果我错了请纠正我)。
我不想保留与外围设备的连接(并浪费其电池)。我希望应用程序 运行 scanForPeripheralWithServices 将在检测到新外围设备时唤醒应用程序,即使应用程序是 killed\suspended user\system.
我找到了另一个问题的相关答案 here,说我可以使用 kill(getpid(), SIGKILL);
模拟应用程序终止 OS 然后,如果我的应用程序使用状态保存和恢复,它应该唤醒(对吧?)。
当我的应用程序检测到 new\old 外围设备时,我希望它创建快速连接、读取一些特征并断开连接。不幸的是,这对于不提供外围对象(仅区域)的 iBeacon 监控是不可能的。我知道我可以在我的应用程序进入 iBeacon 区域后通过 运行ning scanForPeripheralsWithServices 检测外围设备,但这感觉很奇怪 - 直接连续 scanForPeripheralsWithServices 在暂停和杀死后幸存下来,会更有意义。
有什么想法吗?
如果您确定这是不可能的,并且依赖 iBeacon 监控是唯一的方法,请告诉我。
问题的关键部分是:
I want the app to run scanForPeripheralWithServices that will wake up the app when a new peripheral is detected, even if the app was killed\suspended by the user\system.
不幸的是,这仅靠 CoreBluetooth
是不可能的。如果用户关闭应用程序,它将不会从 CoreBluetooth
获得新的 OS 启动事件,除非用户再次手动启动该应用程序。
幸好CoreLocation
没有这个限制。从 iOS 7.1 开始,它会启动一个被杀死的应用程序来通知它检测到蓝牙信标。这将使您有几秒钟的后台 运行 时间来扫描外围设备。