如何使BLE设备在应用程序关闭后调用应用程序

9
我有一个BLE设备(外围设备)和iOS应用程序,它们使用CoreBluetooth.framework进行通信(连接、断开连接、订阅、通知服务)。以下是几种情况:
  1. 应用在前台 -> 我很容易与BLE设备连接。
  2. 应用在后台 -> 我会收到回调并与BLE设备连接。
  3. 应用被从后台删除(杀死应用) -> 即使我从iPhone设备->设置->蓝牙打开->选择BLE设备->连接,我也不会收到任何回调。
I google and get "状态保存与恢复"将被应用程序调用。深入了解后: 在此输入图片描述 在此输入图片描述 在此输入图片描述 同时,如果用户强制退出应用程序,则无法使用状态保存和恢复重新启动或激活应用程序。

我从 这里, 这里这里 阅读到一些内容:

如果你需要在应用程序未运行时执行代码,根据你要做的事情,有几个选项可供选择。 - 后台获取将让你的应用程序在预定间隔约30秒的时间内在后台运行。其目的是获取数据并准备好下一次应用程序运行时的UI。 - 推送通知允许你的应用从服务器获取新鲜数据。如果你想要,在设备上显示一条消息,但这不是必需的——静默推送通知允许你跳过这部分。 - 本地通知允许你向用户显示警报,以及你想要的任何媒体附件和用户可以选择的一些选项。如果他们选择了这些选项,那么你的应用程序可以在前台或后台启动来处理它们。
我尝试使用后台获取,但当应用程序被终止时它也无法唤醒。
我的单一目标是"当应用程序已经终止或被用户关闭时,只要BLE设备连接,应用程序就应该在前台/后台被调用,这样我就可以执行一些操作,比如从BLE设备获取数据并保存"
在项目中使用后台模式: 输入图像描述 其他的BackgroundModes也没有给出任何线索: 输入图像描述 如何在不使用推送通知或静默通知的情况下实现这一点? 如果CoreBluetooth框架中有任何应用程序终止后唤醒应用程序的东西,请告诉我吗?

您目前正在使用哪些后台模式? - jjrscott
已添加后台模式的截图。 - Vinay Mishra
你的外围设备能否作为BLE设备? - Mihir Mehta
是的@mihirmehta。 - Vinay Mishra
2个回答

0
简短的回答是,你不能。
文档明确指出,当用户明确终止应用程序时,您的应用程序将不会被重新启动。
对于静默通知也是如此-如果用户强制终止了您的应用程序(或设备电池状态低于20%),这些通知将无法唤醒您的应用程序。
您的选择有限,可能包括建议用户不要强制终止您的应用程序,或使用基于位置的区域检测来重新启动您的应用程序。
您链接的教程之一展示了一个iBeacon示例,以检测进入和离开iBeacons的范围,并在与后台权限结合使用时重新启动您的应用程序,但再次强调-这并不是您所要求的明确解决方案。
苹果的逻辑很简单-如果用户终止了您的应用程序,则用户不希望它再次运行,这是非常合理的。
问题是,许多用户认为终止应用程序是使其设备更具响应性的标准方法,这引发了一场大辩论(什么更糟?让操作系统冷启动应用程序还是允许应用程序使用静默通知等在后台执行奇怪的操作)。我不会进入那场辩论,这就是事实。

这是通过EAAccessory实现的吗? - Vinay Mishra
@VinayMishra 我也遇到了同样的问题。在后台扫描外围设备时,当用户强制关闭应用程序时,扫描会停止。我该如何解决这个问题?你能帮我吗? - sarit bahuguna

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> 根据文档

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

参考

3> 您的外设应该以ibeacon的形式传输,该外设传输相同的UUID(相同的UUID用于创建CLBeaconRegion

您可能需要调整CLLocationManagerCLBeaconRegion的一些参数,但在我看来这应该可以工作,因为在过去我的应用程序已经成功地从iBeacon检测中唤醒了终止状态....


这并没有回答问题。你提供了在后台重新启动应用程序的方法,这与我在答案中写的方法相同,但问题是关于当BLE设备连接到应用程序时重新启动,你的答案并没有回答它。 - Moshe Gottlieb
没有人承诺给你一个信标,信标!= BLE,此外,问题是关于杀死应用程序的 - 没有人说过要移动到任何地方,另外,您的答案还要求位置更新和重要位置更新,这与信标无关,您的位置代码应该坚持使用 startMonitoring(for: beaconRegion) 并删除位置和重要位置更新。 - Moshe Gottlieb
如果你认为位置更新与信标无关,那么这意味着你根本没有使用过iBeacons。我建议你阅读苹果开发者参考文献中有关iBeacon编程的部分。https://developer.apple.com/documentation/corelocation/determining_the_proximity_to_an_ibeacon请仔细阅读重要提示标签中所写的内容。 - Mihir Mehta
你读过了吗?你需要在后台模式下更新位置,不需要请求后台位置更新。我之前曾经和信标一起工作过,我非常清楚它的工作原理。 - Moshe Gottlieb
@mihirmehta,MosheGottileb,感谢您的评论。但这完全与Core Bluetooth Framework有关,我没有谈论位置、信标等其他内容。当然,位置是使用VisitMonitor和Significant Changes唤醒应用程序的解决方案。但在我的情况下,这并没有得到任何解决? - Vinay Mishra
显示剩余5条评论

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