IOS 可以在后台 运行 并且可以连接到设备的应用程序

IOS Application which can run in background and can connect to Device

我有一个用例,其中有 2 个设备。一个是 Apple Mobile phone 运行 一个 IOS 应用程序,另一个是支持 BLE 的物联网设备。

  1. IOS 应用程序不断扫描附近的 BLE 设备,如果找到具有特定 UUID 服务的 BLE 设备,它将连接到它并通过 GATT 特性发送数据。
  2. 这个 IOS 应用程序应该 运行 持续运行,即使它在后台也是如此。即当它在后台时,它应该扫描具有特定服务的 BLE 设备,如果找到,它应该在后台连接到它并写入 GATT 特性。
  3. 这里的问题是 IOS 当 App 在后台时终止应用程序。
  4. 唯一的办法就是让物联网设备广播IBeacon,而不是普通的BLE Beacon。但是 IOS 如果找到 IBeacon,应用程序将在后台唤醒,但它无法获取正在发送 IBeacon 的设备的 BLE 地址,因此无法连接到它。

我该如何解决这个问题?

虽然 iBeacon 在后台检测速度非常快并且效果最好,但这并不是绝对必要的。您可以在后台检测 iOS 上的 BLE 服务,并在发现时连接到它。

要做到这一点,您必须:

  1. 在您的 Info.plist 声明中:
    <key>UIBackgroundModes</key>
    <array>
        <string>bluetooth-central</string>
    </array>
  1. 在你的 AppDelegate 中 didFinishLaunching 你必须触发 BLE 扫描开始
centralManager?.scanForPeripherals(withServices: [myServiceUUID], options: nil)

如果您执行上述操作,在您的应用程序终止后,iOS 将 auto-launch 您的应用程序,当 new 时,您将收到 didDiscoverPeripheral 的回调 外围设备被发现。

虽然这确实有效,但由于 iOS 跟踪重复项的方式,很难正确测试。如果已经检测到一个设备,并且您终止了您的应用程序,您将不会收到有关其发现的回调——iOS 会跟踪它是否已被检测到。它只会为您提供新设备的启动和回调。

以下是我的测试方法:

  1. 修改您的应用以在检测到 BLE 设备时发送本地通知。验证这个工作。
  2. 关闭您的 BLE 设备
  3. 启动您的应用程序
  4. 重新启动您的 phone。
  5. 打开您的 BLE 设备
  6. 等待上面的通知。要有耐心!当您重新启动 phone 时,BLE 堆栈可能需要几分钟才能完全启动。

上面的 phone 重启步骤对于清除 iPhone 已经看到的设备的缓存至关重要,因此没有资格进行回调。

最后,您可以 使用 BLE 设备加速此过程,该设备还宣传 iBeacon,因为背景检测速度更快且更稳定。但是正如您所注意到的,您不能使用 iBeacon 连接到使用 CoreBluetooth 的外围设备。所以你必须从你的 BLE 设备上同时宣传这两者。这是我一直使用的常用方法。使用 iBeacon 加速您的应用程序的 wake-up 和 CoreBluetooth 服务广告检测以建立连接。