应用终止后,如何通过BLE设备调用应用

时间:2018-12-28 12:02:42

标签: ios swift bluetooth-lowenergy core-bluetooth

我有一个BLE设备(外围设备)和iOS应用程序,它们使用CoreBluetooth.framework(连接,断开连接,订阅,通知服务)相互通信。以下是几种情况:

  1. 该应用程序是前台->我很容易与BLE设备连接。
  2. 应用程序在后台->我收到回调并连接BLE设备
  3. 该应用已从后台删除(杀死该应用)->即使从iPhone设备->设置->蓝牙打开->选择Ble设备,我也没有收到任何回叫->连接。

我用google搜索并获得状态保存和恢复,该应用将被调用。深入驱动后: enter image description here enter image description here enter image description here

这也显示用户退出了应用强制退出,使用状态保存和恢复,应用不会重新启动或激活。

我从thisthisthis阅读,有几点要点:

”如果您需要在应用未运行时执行代码,则根据您要尝试执行的操作,有几个选项可供您选择。  -背景提取可让您的应用按计划的时间间隔在后台运行约30秒。此操作的目的是获取数据并为下次运行该应用程序准备UI。  -推送通知,可让您的应用从服务器中获取新数据。您可以根据需要在设备上显示一条消息,但这不是必需的-通过 静默推送通知 ,您可以跳过该部分。  -本地通知,可让您向用户显示警报以及所需的任何媒体附件以及一些可供用户选择的选项。如果他们选择了这些选项,则可以在前台或后台启动您的应用来处理它们。”

我尝试了Background Fetch,但是当应用程序终止时它也没有唤醒。

我要实现的唯一目标是 “”当应用程序被用户终止或终止时,无论何时连接BLE设备,都应在前台/后台调用该应用程序,以便我执行诸如get之类的操作。 BLE设备中的数据并保存”

在项目中使用背景模式:  enter image description here

其他BackgroundModes也没有提供任何线索: enter image description here

如何在不使用推送通知或静默通知的情况下实现此目标? 如果CoreBluetooth框架中的任何应用程序在终止后唤醒,请告诉我?

2 个答案:

答案 0 :(得分:0)

简单的答案是,您不能
该文档明确指出,当您的应用被用户明确杀死时,它不会重新启动。
静默通知也是如此-如果用户强行终止了您的应用程序(或者设备电池电量低于20%,顺便说一句),这些通知不会唤醒您的应用程序。
您对此的选择是有限的,并且可能包括建议用户不要强制杀死您的应用程序,或者使用基于位置的区域检测来重新启动您的应用程序。
One of the tutorials you've linked展示了一个iBeacon示例,该示例可检测出iBeacon的范围,以及与后台权限结合使用可以重新启动您的应用程序,但是同样-这不是您所要求的,也不是真正的您所描述问题的解决方案。
Apple的逻辑很简单-如果用户杀死了您的应用程序,则用户不希望其再次运行,这很有意义。
事实是,许多用户认为杀死应用程序是提高设备响应速度的标准方法,对此争论不休(更糟糕的是,让操作系统冷启动应用程序或允许应用程序在无提示的情况下在后台执行有趣的操作,等等。)我不会参加辩论,只是那样。

答案 1 :(得分:0)

这是突出显示解决方案的抽象代码。您可能需要调整一些东西。

1>使用UUID创建CLBeaconRegion,开始监视该信标

locationManager.requestAlwaysAuthorization()
    locationManager.delegate = self
    locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation
    locationManager.allowsBackgroundLocationUpdates = true
    locationManager.startUpdatingLocation()
    locationManager.startMonitoringSignificantLocationChanges()
    if let uuid = UUID(uuidString: "B9407F30-F5F8-466E-AFF9-25556B57FE6D") {
           let beaconRegion = CLBeaconRegion(proximityUUID: uuid,identifier:"iBeacon")
           beaconRegion.notifyOnExit = true
           beaconRegion.notifyOnEntry = true
           locationManager.startMonitoring(for: beaconRegion)                       
    }

2>根据文档

  

如果您开始监视区域,并且随后您的应用程序处于   终止后,系统会自动将其重新启动到后台   如果区域边界越过

Reference

3>您的外围设备应作为ibeacon进行传输,它们传输相同的UUID(与您为其创建的CLBeaconRegion相同的UUID)

您可能需要使用CLLocationManagerCLBeaconRegion的几个参数,但这在我看来应该可行,因为过去我的应用已在iBeacon检测中成功从终止状态唤醒...