【发布时间】:2016-03-29 19:09:58
【问题描述】:
我正在尝试创建一个应用程序,该应用程序在检测到宣传预定义服务的新外围设备时唤醒到后台模式。即使用户最小化应用程序、应用程序被暂停、应用程序被用户杀死或应用程序被系统杀死,我也希望唤醒发生。显然我也希望应用程序被应用商店接受(所以不要建议添加所有可能的 UIBackgroundModes 并永远在后台运行的解决方案......)。
我可以将 bluetooth-central 添加到 UIBackgroundModes,因为我的应用符合 here 的描述 - 它需要在后台与外围设备通信。
我找到了一些关于 State Preservation and Restoration 的文档 here。它描述了一个应用程序连接到蓝牙门锁的场景,并且由于用户远离门而导致连接中断。据我了解,当用户回到门口并且 iPhone 检测到门锁(我想是通过它的 MAC 地址)时,它会重新连接到门锁并在后台模式下唤醒应用程序(如果我是,请纠正我错了)。
我不想保留与外围设备的连接(并浪费其电池)。我希望应用程序运行 scanForPeripheralWithServices,它会在检测到新外围设备时唤醒应用程序,即使应用程序已被用户\系统杀死\暂停。
我找到了 here 对另一个问题的相关答案,说我可以使用 kill(getpid(), SIGKILL); 模拟应用程序终止,然后,如果我的应用程序使用 State Preservation & Restoration em>,它应该会醒来(对吧?)。
当我的应用检测到新\旧外围设备时,我希望它创建快速连接、读取一些特征并断开连接。不幸的是,这对于不提供外围对象(仅一个区域)的 iBeacon 监控是不可能的。我知道我可以在我的应用程序进入 iBeacon 区域后通过运行 scanForPeripheralsWithServices 来检测外围设备,但这感觉很奇怪 - 一个直接连续的 scanForPeripheralsWithServices 可以在暂停和杀戮中幸存下来,会产生很多更有意义。
有什么想法吗?
如果您确定这是不可能的,并且依赖 iBeacon 监控是唯一的方法,请告诉我。
【问题讨论】:
-
如果用户杀死了您的应用程序,那么您将无能为力。在用户重新启动您的应用之前,您的应用不会运行。另一部分很简单。您可以在后台扫描提供特定服务的外围设备,还可以对已知外围设备进行挂起连接,当看到该外围设备时,该连接将自动完成。
-
这里是一些演示后台扫描和连接的示例代码github.com/paulw11/BTBackground
-
所以你的意思是即使建立了连接,如果用户从应用切换器中杀死了应用,它不会重新启动?即使重新连接后也不行? (会有任何重新连接吗?)。
-
如果我在用户甚至有机会从应用切换器中杀死它之前就在
willResignActive上调用kill(getpid(), SIGKILL)会发生什么?这是否意味着应用永远不会被用户杀死,因此会被唤醒? -
通常在 iOS 中,如果用户从应用切换器中终止应用,则假定用户希望它终止并且 iOS 不会重新启动应用,直到用户点击图标
标签: ios bluetooth bluetooth-lowenergy core-bluetooth ibeacon