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

问题描述

我有一个用例,其中有2个设备。一种是运行IOS应用程序的Apple移动电话,另一种是启用BLE的IOT设备。

  1. IOS应用程序会连续扫描附近的BLE设备,如果找到具有特定UUID服务的BLE设备,它将连接到该设备并通过GATT特性发送数据。
  2. 此IOS应用程序即使在后台也应连续运行。那是当它在后台时,它应该扫描具有特定服务的BLE设备,如果找到了它,则应该在后台连接到它并编写GATT特性。
  3. 这里的问题是当应用程序在后台时,IOS会终止应用程序。
  4. 唯一的方法是使IOT设备广播IBeacon,而不是普通的BLE Beacon。但是,如果找到IBeacon,IOS应用程序将在后台唤醒,但无法获取发送IBeacon的设备的BLE地址,并且无法连接到它。

我该如何解决这个问题?

解决方法

尽管iBeacon在后台检测速度非常快并且效果最佳,但这并不是绝对必要的。您可以在后台在iOS上检测BLE服务,并在发现服务后将其连接。

为此,您必须:

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

如果执行上述操作,则在您的应用终止后,iOS将自动启动您的应用,当发现外设时,您将获得对didDiscoverPeripheral的回调。

虽然这确实可行,但是由于iOS跟踪重复项的方式,很难正确测试。如果已经检测到设备,并且您杀死了您的应用程序,则不会获得有关其发现的回调-iOS会跟踪已检测到该设备。它只会为您启动和回调新设备。

这是我要测试的方式:

  1. 修改您的应用以在检测到BLE设备时发送本地通知。验证此工作。
  2. 关闭BLE设备
  3. 启动您的应用
  4. 重新启动手机。
  5. 打开BLE设备
  6. 等待上面的通知。耐心一点!重新启动手机时,BLE堆栈可能在几分钟内无法完全启动。

上面的电话重新启动步骤对于清除缓存中的iPhone已经看到并因此不符合回调条件至关重要。

最后,您可以
使用BLE设备加速该过程,该设备还可以宣传iBeacon,因为背景检测速度更快且气质更低。但是请注意,您不能使用iBeacon通过CoreBluetooth连接到外围设备。因此,您必须从BLE设备中同时发布广告。这是我一直使用的常用方法。使用iBeacon可以加快应用程序的唤醒速度,并使用CoreBluetooth服务广告检测来建立连接。