IOS 可以在后台 运行 并且可以连接到设备的应用程序
IOS Application which can run in background and can connect to Device
我有一个用例,其中有 2 个设备。一个是 Apple Mobile phone 运行 一个 IOS 应用程序,另一个是支持 BLE 的物联网设备。
- IOS 应用程序不断扫描附近的 BLE 设备,如果找到具有特定 UUID 服务的 BLE 设备,它将连接到它并通过 GATT 特性发送数据。
- 这个 IOS 应用程序应该 运行 持续运行,即使它在后台也是如此。即当它在后台时,它应该扫描具有特定服务的 BLE 设备,如果找到,它应该在后台连接到它并写入 GATT 特性。
- 这里的问题是 IOS 当 App 在后台时终止应用程序。
- 唯一的办法就是让物联网设备广播IBeacon,而不是普通的BLE Beacon。但是 IOS 如果找到 IBeacon,应用程序将在后台唤醒,但它无法获取正在发送 IBeacon 的设备的 BLE 地址,因此无法连接到它。
我该如何解决这个问题?
虽然 iBeacon 在后台检测速度非常快并且效果最好,但这并不是绝对必要的。您可以在后台检测 iOS 上的 BLE 服务,并在发现时连接到它。
要做到这一点,您必须:
- 在您的 Info.plist 声明中:
<key>UIBackgroundModes</key>
<array>
<string>bluetooth-central</string>
</array>
- 在你的 AppDelegate 中
didFinishLaunching
你必须触发 BLE 扫描开始
centralManager?.scanForPeripherals(withServices: [myServiceUUID], options: nil)
如果您执行上述操作,在您的应用程序终止后,iOS 将 auto-launch 您的应用程序,当 new 时,您将收到 didDiscoverPeripheral
的回调 外围设备被发现。
虽然这确实有效,但由于 iOS 跟踪重复项的方式,很难正确测试。如果已经检测到一个设备,并且您终止了您的应用程序,您将不会收到有关其发现的回调——iOS 会跟踪它是否已被检测到。它只会为您提供新设备的启动和回调。
以下是我的测试方法:
- 修改您的应用以在检测到 BLE 设备时发送本地通知。验证这个工作。
- 关闭您的 BLE 设备
- 启动您的应用程序
- 重新启动您的 phone。
- 打开您的 BLE 设备
- 等待上面的通知。要有耐心!当您重新启动 phone 时,BLE 堆栈可能需要几分钟才能完全启动。
上面的 phone 重启步骤对于清除 iPhone 已经看到的设备的缓存至关重要,因此没有资格进行回调。
最后,您可以 使用 BLE 设备加速此过程,该设备还宣传 iBeacon,因为背景检测速度更快且更稳定。但是正如您所注意到的,您不能使用 iBeacon 连接到使用 CoreBluetooth 的外围设备。所以你必须从你的 BLE 设备上同时宣传这两者。这是我一直使用的常用方法。使用 iBeacon 加速您的应用程序的 wake-up 和 CoreBluetooth 服务广告检测以建立连接。
我有一个用例,其中有 2 个设备。一个是 Apple Mobile phone 运行 一个 IOS 应用程序,另一个是支持 BLE 的物联网设备。
- IOS 应用程序不断扫描附近的 BLE 设备,如果找到具有特定 UUID 服务的 BLE 设备,它将连接到它并通过 GATT 特性发送数据。
- 这个 IOS 应用程序应该 运行 持续运行,即使它在后台也是如此。即当它在后台时,它应该扫描具有特定服务的 BLE 设备,如果找到,它应该在后台连接到它并写入 GATT 特性。
- 这里的问题是 IOS 当 App 在后台时终止应用程序。
- 唯一的办法就是让物联网设备广播IBeacon,而不是普通的BLE Beacon。但是 IOS 如果找到 IBeacon,应用程序将在后台唤醒,但它无法获取正在发送 IBeacon 的设备的 BLE 地址,因此无法连接到它。
我该如何解决这个问题?
虽然 iBeacon 在后台检测速度非常快并且效果最好,但这并不是绝对必要的。您可以在后台检测 iOS 上的 BLE 服务,并在发现时连接到它。
要做到这一点,您必须:
- 在您的 Info.plist 声明中:
<key>UIBackgroundModes</key>
<array>
<string>bluetooth-central</string>
</array>
- 在你的 AppDelegate 中
didFinishLaunching
你必须触发 BLE 扫描开始
centralManager?.scanForPeripherals(withServices: [myServiceUUID], options: nil)
如果您执行上述操作,在您的应用程序终止后,iOS 将 auto-launch 您的应用程序,当 new 时,您将收到 didDiscoverPeripheral
的回调 外围设备被发现。
虽然这确实有效,但由于 iOS 跟踪重复项的方式,很难正确测试。如果已经检测到一个设备,并且您终止了您的应用程序,您将不会收到有关其发现的回调——iOS 会跟踪它是否已被检测到。它只会为您提供新设备的启动和回调。
以下是我的测试方法:
- 修改您的应用以在检测到 BLE 设备时发送本地通知。验证这个工作。
- 关闭您的 BLE 设备
- 启动您的应用程序
- 重新启动您的 phone。
- 打开您的 BLE 设备
- 等待上面的通知。要有耐心!当您重新启动 phone 时,BLE 堆栈可能需要几分钟才能完全启动。
上面的 phone 重启步骤对于清除 iPhone 已经看到的设备的缓存至关重要,因此没有资格进行回调。
最后,您可以 使用 BLE 设备加速此过程,该设备还宣传 iBeacon,因为背景检测速度更快且更稳定。但是正如您所注意到的,您不能使用 iBeacon 连接到使用 CoreBluetooth 的外围设备。所以你必须从你的 BLE 设备上同时宣传这两者。这是我一直使用的常用方法。使用 iBeacon 加速您的应用程序的 wake-up 和 CoreBluetooth 服务广告检测以建立连接。