问题描述
我有一个用例,其中有2个设备。一种是运行IOS应用程序的Apple移动电话,另一种是启用BLE的IOT设备。
- IOS应用程序会连续扫描附近的BLE设备,如果找到具有特定UUID服务的BLE设备,它将连接到该设备并通过GATT特性发送数据。
- 此IOS应用程序即使在后台也应连续运行。那是当它在后台时,它应该扫描具有特定服务的BLE设备,如果找到了它,则应该在后台连接到它并编写GATT特性。
- 这里的问题是当应用程序在后台时,IOS会终止应用程序。
- 唯一的方法是使IOT设备广播IBeacon,而不是普通的BLE Beacon。但是,如果找到IBeacon,IOS应用程序将在后台唤醒,但无法获取发送IBeacon的设备的BLE地址,并且无法连接到它。
我该如何解决这个问题?
解决方法
尽管iBeacon在后台检测速度非常快并且效果最佳,但这并不是绝对必要的。您可以在后台在iOS上检测BLE服务,并在发现服务后将其连接。
为此,您必须:
- 在您的Info.plist中声明:
<key>UIBackgroundModes</key>
<array>
<string>bluetooth-central</string>
</array>
- 在
didFinishLaunching
的AppDelegate中,您必须触发BLE扫描开始
centralManager?.scanForPeripherals(withServices: [myServiceUUID],options: nil)
如果执行上述操作,则在您的应用终止后,iOS将自动启动您的应用,当发现新外设时,您将获得对didDiscoverPeripheral
的回调。
虽然这确实可行,但是由于iOS跟踪重复项的方式,很难正确测试。如果已经检测到设备,并且您杀死了您的应用程序,则不会获得有关其发现的回调-iOS会跟踪已检测到该设备。它只会为您启动和回调新设备。
这是我要测试的方式:
- 修改您的应用以在检测到BLE设备时发送本地通知。验证此工作。
- 关闭BLE设备
- 启动您的应用
- 重新启动手机。
- 打开BLE设备
- 等待上面的通知。耐心一点!重新启动手机时,BLE堆栈可能在几分钟内无法完全启动。
上面的电话重新启动步骤对于清除缓存中的iPhone已经看到并因此不符合回调条件至关重要。
最后,您可以
使用BLE设备加速该过程,该设备还可以宣传iBeacon,因为背景检测速度更快且气质更低。但是请注意,您不能使用iBeacon通过CoreBluetooth连接到外围设备。因此,您必须从BLE设备中同时发布广告。这是我一直使用的常用方法。使用iBeacon可以加快应用程序的唤醒速度,并使用CoreBluetooth服务广告检测来建立连接。