题 如何使用蓝牙信号(BLE)唤醒iOS应用程序


使用带有CoreBluetooth(没有iBeacon)的BLE,有没有办法在设备收到蓝牙信号时唤醒应用程序未运行的应用程序?

我用redbearlab的BLE Shield模拟了一个灯塔(http://redbearlab.com/bleshield/)。

谢谢, 担

*更新03/05/14 *

看起来苹果已经推出了iOS 7.1的主要更新:现在,如果iOS检测到与您的应用匹配的UUID,它将为您打开应用。该应用程序只需要安装,它不必运行(AppDelegate中的逻辑需要响应唤醒呼叫)。


15
2017-11-12 14:38


起源


有关详细信息,请参阅: helpdesk.estimote.com/hc/communities/public/questions/... - DAN
您应该在更新中更具体。您链接的帖子太模糊,无法使用。 - allprog
DAN的链接不起作用。请改用这个: forums.estimote.com/t/... - inigo333


答案:


如果应用程序在后台运行然后关闭(我的意思是终止 - 由于来自其他应用程序的内存压力,当您双击主页按钮时,您在后台应用程序列表中不会再看到它),那么iOS将会在调用委托时(假设您在.plist中列出了后台模式),请再次将其唤醒。

如果应用程序在后台运行,然后由用户关闭(我的意思是终止。所以用户双击以获取在后台运行的应用程序列表,然后在后台列表中单击您的应用程序,直到它摆动并且然后按下应用旁边的'x'来杀死它)然后这清楚地表明用户不希望应用程序在后台运行,并且应用程序将不会重新启动。用户必须重新启动应用程序,以便其代表在后台重新开始运行(iOS7中的新功能)。

更新: 我不确定这是否在文档中,但它在CoreBluetooth WWDC 2013视频中。我建议你看。他们花了很多关于CoreBluetooth在后台表现的视频。


8
2017-11-14 02:16



我正在考虑以下情况:你已经安装了一个与商店相关的应用程序,但很长一段时间没有使用它..有一天你走过这样一个使用灯塔通知人们特殊促销的商店。在这种情况下,您可能希望了解该促销信息但不了解应用状态。因此,您是否声明iOS7无法实现上一个场景?此外,你能否指出我的Apple文档谈论你的声明“用户必须重新启动应用程序,让其代表在后台重新开始运行”? - DAN
只要用户从未杀死应用程序(通过按下应用程序图标直到它摆动然后按下应用程序旁边的“x”),就可以实现该方案。我编辑了我的答案,以澄清“封闭”的含义。我还添加了有关Apple文档的详细信息。 - Spectravideo328
在iOS7中,您可以通过从后台列表中向上轻拂来杀死应用程序。并且只是为了澄清:我指的是用户双击主页按钮(以获取在后台运行的应用程序列表),然后轻弹或按下应用程序图标,直到它摆动等等....我不是指用户按下主屏幕上的应用程序图标,直到它摆动,然后按下旁边的“x”,因为这显然会删除该应用程序。 - Spectravideo328
即使用户强行退出应用程序(双击主页并向上滑动),信标也会在后台启动应用程序几秒钟。我在iOS 9和10上测试了这个。 - anders


根据我的理解,如果您的应用以前没有与BLE外围设备连接,那么没有。

如果您的应用先前已与BLE外围设备连接,请使用:

-connectPeripheral:选项

连接请求不会超时。调用此方法的最佳位置是您的应用程序失去与BLE外围设备的连接。当您在CBCentralManagerDelegate协议中失去与外围设备的连接时,您将收到通知:

-centralManager:didDisconnectPeripheral:错误

因此,下次您的应用程序进入BLE外设的范围时,它将触发此方法。另请注意,初始化CBCentralManager时需要设置State Preservation和Restoration。


2
2017-11-13 17:08



使用信标技术,无需将外围设备与设备配对。 - DAN
@DAN - 这是真的,但请注意“连接”和“配对”也不是一回事。 - Chris Stratton
@David Chu你能提供一些关于此的示例代码吗? - sorunluadam


https://developer.apple.com/library/ios/documentation/NetworkingInternetWeb/Conceptual/CoreBluetooth_concepts/CoreBluetoothBackgroundProcessingForIOSApps/PerformingTasksWhileYourAppIsInTheBackground.html

当任何CBCentralManagerDelegate或CBPeripheralDelegate委托方法为时,系统会唤醒您的应用程序   调用,允许您的应用处理重要的中心角色事件,   例如当建立或拆除连接时,当a   外围设备发送更新的特征值,并在中心时发送   经理的状态变化。

要在后台执行某些外围角色任务,您   必须包含UIBackgroundModes键和蓝牙外设   应用的Info.plist文件中的值。当这个键值对时   包含在应用程序的Info.plist文件中,系统将您的应用程序唤醒   处理读取,写入和订阅事件。


1
2017-11-12 14:42



我的意思是如何在应用程序关闭且不在后台运行时唤醒应用程序;是否有任何方法在设备进入蓝牙信号(即信标)覆盖的区域时自动调用? - DAN
在这种情况下,使用 - (void)startMonitoringForRegion:(CLRegion *)region desiredAccuracy:(CLLocationAccuracy)准确性并传入CLBeaconRegion作为区域,应启动应用程序。这是一些示例代码 - joris.kluivers.nl/blog/2013/09/27/playing-with-ibeacon - Andrew
这只有iBeacon技术才有可能;我不知道Estimote如何实现这样的协议,因为Apple还没有发布它。我在Arduino上与BLE合作。 - DAN


您可以尝试在info.plist中声明voip。目前,我的应用程序在一段时间后自动重新启动,甚至用户终止它。


-1
2018-04-28 11:28