Swift中的BLE背景扫描

use*_*092 5 ios bluetooth-lowenergy swift

我试图让我的应用程序在后台扫描BLE设备,并在Swift中搜索一些广告数据.我一直无法找到任何有关此内容的教程或问题.

基本上,当应用程序不在前台并且用户重新启动手机时,有没有办法在后台自动执行此操作?: 使用iOS获取蓝牙LE扫描响应数据

我希望你能指出我正确的方向.谢谢

Jon*_*gel 8

第1步:为您的项目功能启用蓝牙背景模式

在此输入图像描述

第2步:确保将相应的内容添加到info.plist文件中

在此输入图像描述

这是plist代码,如果它没有添加它:

<key>UIBackgroundModes</key>
 <array>
  <string>audio</string>
  <string>bluetooth-central</string>
 </array>
Run Code Online (Sandbox Code Playgroud)

然后,当您在CBCentralmanager上调用"scanForPeripheralsWithServices"时,您必须指定要扫描的服务数组.你不能传递一个空数组.如果你传递的是nil,它仍会扫描,而不是在后台.

所以指定一个服务UUID的数组是这样的:

let arrayOfServices: [CBUUID] = [CBUUID(string: "8888")]
self.myBluetoothManager?.scanForPeripheralsWithServices(arrayOfServices, options: nil)
Run Code Online (Sandbox Code Playgroud)

现在,如果你关心选项,你可以传递一个选项词典来代替我在上面传递的nil.大多数情况下,这用于指定您是否要在连接之前连续查看设备RSSI,或者只是想要广告数据包一次.放一个:

println(advertisementData["kCBAdvDataLocalName"] as! String) 
println(advertisementData["kCBAdvDataManufacturerData"] as! NSData)
Run Code Online (Sandbox Code Playgroud)

在"didDiscoverPeripheral"委托方法中观察不同的行为.

如果您想要重复键,这是您将传递的词典:

let dictionaryOfOptions = [CBCentralManagerScanOptionAllowDuplicatesKey : true]
self.myBluetoothManager?.scanForPeripheralsWithServices(arrayOfServices, options: dictionaryOfOptions)
Run Code Online (Sandbox Code Playgroud)

现在Apple说,当你的应用程序进入后台模式时,它默认此扫描选项为false,但从iOS 8.3开始,我看到它继续扫描重复键.

关于背景执行的最后一点说明.如果iOS决定暂停您的应用,扫描将停止.如果有一堆应用正在运行,我已经看到这种情况会在30秒内发生.