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

17
在使用CoreBluetooth(无iBeacon)时,是否有一种方法可以在设备接收到蓝牙信号时唤醒未运行的应用程序?
我正在使用RedBearlab的BLE Shield模拟信标(http://redbearlab.com/bleshield/)。
谢谢, 丹
*更新03/05/14*
看起来苹果在iOS 7.1中引入了一个重大更新:现在iOS会为您打开应用程序,如果它检测到与您的应用程序匹配的UUID。 应用程序只需要安装,不必运行 (AppDelegate中需要逻辑来响应唤醒调用)。

更多信息请参见:http://helpdesk.estimote.com/hc/communities/public/questions/200458547--Hear-a-beacon-when-app-is-closed-no-background- - DAN
你应该更具体地更新。你链接的帖子过于模糊,没有什么用处。 - allprog
DAN的链接无法使用,请使用以下链接: https://forums.estimote.com/t/hear-a-beacon-when-app-is-closed-no-background/1036 - inigo333
4个回答

10
如果应用程序在后台运行,然后被关闭(我这里指终止 - 当你双击主屏幕按钮时不再在后台应用程序列表中看到它),由于其他应用程序的内存压力,那么iOS将在调用委托时负责重新唤醒它(假设您在.plist中列出了后台模式)。
如果应用程序在后台运行,然后被用户关闭(再次指终止。因此,用户双击获取在后台运行的应用程序列表,然后单击背景列表中的您的应用程序,直到它摇晃,然后按下'app'旁边的'x'以杀死它),则这是明确表明用户不希望该应用程序在后台运行,应用程序将不会重新启动。用户必须重新启动应用程序才能使其委托在后台再次开始运行(在iOS7中新增)。
更新: 我不确定文档中是否有此内容,但在CoreBluetooth WWDC 2013视频中有提到。我建议您观看一下。他们花了很多时间在视频中介绍了CoreBluetooth在后台的行为。

我在考虑以下情况:你安装了一个与商店相关的应用程序,但已经很长时间没有使用过了。有一天,你经过一家使用信标通知人们特别促销活动的商店。在这种情况下,你可能想了解该促销活动的信息,但不知道应用程序的状态。 因此,您是否认为iOS7无法实现先前的情况?此外,您能否指向苹果的文档,谈论您的声明“用户必须重新启动应用程序才能使其代表再次在后台开始运行”? - DAN
只要用户没有关闭应用程序(通过按住应用程序图标直到它晃动,然后按“x”),就可以实现该场景。我编辑了我的答案以澄清我所说的“关闭”的含义。我还添加了有关苹果文档的详细信息。 - Khaled Barazi
1
在iOS7中,您可以通过从后台列表中向上轻扫来关闭应用程序。只是为了澄清:我指的是用户双击主页按钮(以获取在后台运行的应用程序列表),然后轻扫或按应用程序图标直到它摇晃等等... 我不是指用户按主屏幕上的应用程序图标直到它摇晃,然后按“x”旁边的图标,因为那显然会删除该应用程序。 - Khaled Barazi
1
一个信标会在后台启动应用程序几秒钟,即使用户已经强制退出了应用程序(双击主页并向上滑动)。我已经在iOS 9和10上进行了测试。 - anders

5
据我所知,如果您的应用程序以前没有与BLE外设连接,则不行。如果您的应用程序以前连接过BLE外设,则使用-connectPeripheral:options。连接请求不会超时。调用此方法的最佳位置是当您的应用程序失去与BLE外设的连接时。您将在CBCentralManagerDelegate协议中收到有关与外设失去连接的通知。因此,下次您的应用程序进入BLE外设的范围时,它将触发此方法。还要注意,在初始化CBCentralManager时,您需要设置状态保存和恢复。

3
有了信标技术,就不需要将外围设备与设备配对。 - DAN
2
@DAN - 这是真的,但请注意,“connect”和“pair”也不是同一件事。 - Chris Stratton
@David Chu,你能提供关于这个的示例代码吗? - yusufonderd

1

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

系统在调用任何CBCentralManagerDelegate或CBPeripheralDelegate委托方法时唤醒您的应用程序,使其能够处理重要的中心角色事件,例如连接建立或断开,外设发送更新的特征值以及中央管理器的状态更改。
为了在后台执行某些外围角色任务,您必须在应用程序的Info.plist文件中包含UIBackgroundModes键和bluetooth-peripheral值。当此键值对包含在应用程序的Info.plist文件中时,系统会唤醒您的应用程序来处理读取、写入和订阅事件。

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

-2

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接