【问题标题】:How to BLE device will invoke the app, when app has terminated当应用程序终止时,BLE 设备如何调用应用程序
【发布时间】:2019-05-26 06:22:33
【问题描述】:

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

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

我 google 并获得 State Preservation and Restoration 将被调用该应用程序。深度驱动后:

这也显示了 App Force Quit by the user ,应用程序不会使用状态保存和恢复重新启动或激活。

我从thisthisthis 读到,有几点意见:

“如果您需要在应用未运行时执行代码,您可以选择多种方式,具体取决于您要执行的操作。 - Background fetch 将让您的应用在后台按预定时间间隔运行大约 30 秒。这样做的目的是获取数据并为应用程序下一次运行准备 UI。 - 推送通知让您的应用从您的服务器获取新数据。如果需要,您可以在设备上显示消息,但这不是必需的 - 静默推送通知让您跳过该部分。 - 本地通知让您可以向用户显示警报,以及您想要的任何媒体附件以及供用户选择的一些选项。如果他们选择了这些选项,那么您的应用程序可以在前台或后台启动以处理它们。”

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

我要实现的唯一目标是“当应用程序已被用户终止或杀死时,每当连接 BLE 设备时,应用程序应在前台/后台调用,以便我执行一些操作,如 get BLE 设备中的数据并保存”

在项目中使用背景模式:

其他 BackgroundModes 也没有给出任何线索:

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

【问题讨论】:

  • 您目前使用哪些后台模式?
  • 添加后台模式截图。
  • 你的外围设备可以作为BLE设备吗?
  • 是的@mihirmehta。

标签: ios swift bluetooth-lowenergy core-bluetooth


【解决方案1】:

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

【讨论】:

  • 这是通过EAAccessory实现的吗?
  • @VinayMishra 我面临同样的问题。在后台外围设备被扫描但是当用户强行杀死应用程序时扫描停止。我如何实现相同的?你能帮帮我吗?
【解决方案2】:

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

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> 您的外围设备应作为传输相同 UUID 的 ibeacon 传输(与您创建的相同 UUID CLBeaconRegion

您可能需要使用 CLLocationManagerCLBeaconRegion 的几个参数,但我认为这应该可以工作,因为过去我的应用程序已成功从 iBeacon 检测的终止状态唤醒......

【讨论】:

  • 这没有回答问题。您提供了在后台重新启动应用程序的方法,这与我在回答中所写的方法相同,但问题是关于在 BLE 设备连接到应用程序时重新启动,您的回答没有回答。
  • 当 BLE 外围设备连接到您的手机时,您的应用程序将自动“进入”它监控的 Beacon 区域......它不会随机重新启动应用程序......它会在以下情况下重新启动应用程序应用程序被输入到由您的外围设备传输的特定信标区域......
  • 没有人答应给你一个信标,信标!= BLE,此外,问题是关于杀死应用程序 - 没有人说任何关于移动任何地方,此外,你的回答还要求位置更新和重要的位置更新与信标无关,您的位置代码应坚持startMonitoring(for: beaconRegion) 并删除位置和重要的位置更新。
  • 让提问者决定......你为什么要承受这么多的负担?
  • 另外,如果您认为位置更新与信标无关...。这意味着您根本没有使用 iBeacons ....我建议您阅读 Apple Developer reference for iBeacon 编程...developer.apple.com/documentation/corelocation/…阅读重要的标签中写的内容...
猜你喜欢
  • 1970-01-01
  • 2022-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-16
  • 1970-01-01
  • 1970-01-01
  • 2011-03-23
相关资源
最近更新 更多