【问题标题】:Background Scanning for BLE in SwiftSwift 中 BLE 的后台扫描
【发布时间】:2015-07-25 22:32:59
【问题描述】:

我正在尝试让我的应用在后台扫描 BLE 设备并在 Swift 中搜索一些广告数据。我在此处找不到任何涉及此内容的教程或问题。

基本上,当应用不在前台并且用户重新启动手机时,是否有办法在后台自动执行此操作?: Obtaining Bluetooth LE scan response data with iOS

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

【问题讨论】:

  • 我几乎可以肯定这在 iOS 中是被禁止的。所以不行。我不相信这是可能的。在所有可能的情况下,您可能想要使用蓝牙经典之类的东西。但是,并非所有人都可以在 iOS 上使用经典蓝牙。您必须加入 Apple 的 MFI 计划并获得 Apple 自己的特别许可。
  • 只要设备在宣传 BLE GATT 服务,那么在后台扫描服务就包含在 Apple 的核心蓝牙编程指南中。你读过吗?你有没有尝试过任何基于此的东西?
  • 肯定,我所读到的内容与基于 UUID 和标识符的识别设备有关。我试图通过广告数据来做到这一点,而没有实际连接到外围设备,大概需要对广告数据进行后台扫描。

标签: ios swift bluetooth-lowenergy


【解决方案1】:

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

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

如果没有添加,这里是 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)

现在Apple says that when your app goes in the background mode 它默认此扫描选项为 false,但从 iOS 8.3 开始,我看到它继续使用重复键进行扫描。

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

【讨论】:

    猜你喜欢
    • 2013-08-18
    • 1970-01-01
    • 2020-11-25
    • 1970-01-01
    • 1970-01-01
    • 2018-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多