Swift中的BLE背景扫描

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

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

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

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

在此处输入图像描述

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

在此处输入图像描述

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

UIBackgroundModes  audio bluetooth-central  

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

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

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

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

 println(advertisementData["kCBAdvDataLocalName"] as! String) println(advertisementData["kCBAdvDataManufacturerData"] as! NSData) 

在“didDiscoverPeripheral”委托方法中观察不同的行为。

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

 let dictionaryOfOptions = [CBCentralManagerScanOptionAllowDuplicatesKey : true] self.myBluetoothManager?.scanForPeripheralsWithServices(arrayOfServices, options: dictionaryOfOptions) 

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

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