Swift中的BLE后台扫描

8
我想让我的应用程序在后台扫描BLE设备,并使用Swift搜索一些广告数据。我找不到任何涵盖这方面内容的教程或问题解答。基本上,当应用程序不在前台且用户已重新启动他们的手机时,是否有自动执行此操作的方法?希望你能指点我正确的方向。谢谢。参考链接:Obtaining Bluetooth LE scan response data with iOS

我几乎可以确定在iOS中这是被禁止的。所以,不行。我不相信这是可能的。很有可能,你可能想使用类似于经典蓝牙的东西。然而,并不是每个人都可以在iOS上使用经典蓝牙。你必须成为苹果的MFI计划的一部分,并从苹果那里获得特殊许可。 - Oxcug
1
只要设备正在广播BLE GATT服务,那么在后台扫描服务就可以在苹果的Core Bluetooth编程指南中找到相关内容。你有阅读过吗?你尝试过基于这个的任何操作吗? - Paulw11
肯定的,我所读到的内容涉及基于UUID和标识符识别设备。我正在尝试通过广告数据来实现它,而不需要实际连接到外围设备,可能需要进行背景扫描以获取广告数据。 - user3246092
1个回答

11
步骤1:为您的项目启用蓝牙后台模式。

enter image description here

步骤2:确保适当的内容已添加到您的info.plist文件中。

enter image description here

如果未添加,请使用以下plist代码:
<key>UIBackgroundModes</key>
 <array>
  <string>audio</string>
  <string>bluetooth-central</string>
 </array>

当你在 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)

现在,苹果表示当您的应用进入后台模式时,默认情况下会将扫描选项设为false,但是从iOS 8.3开始,我发现它会使用重复键继续进行扫描。
关于后台执行的最后一点说明:如果iOS决定暂停您的应用,则扫描将停止。如果有一堆应用程序运行,则可能在30秒内就会发生这种情况。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接