You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Swift 3中如何获取所有已配对BLE蓝牙设备列表?

获取iOS中所有已配对BLE设备的解决方案(Swift 3)

首先得明确一个关键限制:CoreBluetooth框架并没有提供直接获取所有系统级已配对BLE设备的API。这是因为BLE的配对(准确说是绑定/Bonding)是设备与iOS系统之间的加密关系,苹果出于隐私和安全考虑,不会让App随意访问所有已绑定的BLE设备列表——你只能获取到你的App曾经扫描、连接过的设备。

针对你的需求,这里有两个可行的方案:

方案1:存储并复用设备UUID(推荐)

当你的App首次发现或连接到BLE设备时,把设备的identifier(UUID类型)持久化存储起来(比如用UserDefaults、Core Data或者Keychain)。之后需要获取“已配对”列表时,就用这个UUID数组去查询系统中对应的设备。

代码示例:

1. 存储设备UUID

当你在didDiscover或者didConnect方法中获取到设备时:

// 假设peripheral是你找到的BLE设备
let deviceUUIDs = UserDefaults.standard.array(forKey: "PairedBLEDevices") as? [String] ?? []
let uuidString = peripheral.identifier.uuidString
if !deviceUUIDs.contains(uuidString) {
    var updatedUUIDs = deviceUUIDs
    updatedUUIDs.append(uuidString)
    UserDefaults.standard.set(updatedUUIDs, forKey: "PairedBLEDevices")
    UserDefaults.standard.synchronize()
}

2. 获取已配对设备列表

当你需要展示所有曾经配对过的设备时:

// 从存储中取出UUID字符串,转成UUID类型
guard let uuidStrings = UserDefaults.standard.array(forKey: "PairedBLEDevices") as? [String],
      let uuids = uuidStrings.compactMap({ UUID(uuidString: $0) }) else {
    print("没有已存储的配对设备")
    return
}

// 查询系统中对应的设备
let pairedPeripherals = centralManager.retrievePeripherals(withIdentifiers: uuids)

// 遍历结果,获取设备信息
for peripheral in pairedPeripherals {
    print("已配对设备名称:\(peripheral.name ?? "未知"),UUID:\(peripheral.identifier)")
}

这个方法的优势是:不管设备当前是否连接、是否在广播,只要系统中还保留着这个设备的绑定信息,就能获取到它的基本信息。

方案2:扫描时过滤已绑定设备(仅适用于正在广播的设备)

如果你需要找到曾经配对过且当前正在广播的设备,可以在扫描时结合广告数据和设备特征来过滤。比如,已绑定的设备在广播时可能会携带特定的服务UUID,或者你可以通过retrievePeripherals提前查询已知UUID的设备,再对比扫描结果。

代码示例:

// 先获取已存储的UUID对应的设备
let knownPeripherals = centralManager.retrievePeripherals(withIdentifiers: storedUUIDs)
let knownUUIDs = knownPeripherals.map({ $0.identifier })

// 开始扫描
centralManager.scanForPeripherals(withServices: nil, options: [CBCentralManagerScanOptionAllowDuplicatesKey: false])

// 在didDiscover中过滤
func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi: NSNumber) {
    // 检查当前扫描到的设备是否在已知的已配对列表中
    if knownUUIDs.contains(peripheral.identifier) {
        print("找到已配对且正在广播的设备:\(peripheral.name ?? "未知")")
    }
}

但要注意:如果设备断开后没有广播,这个方法就无法找到它。

重要提示

  • iOS的蓝牙权限:确保你的App的Info.plist中添加了NSBluetoothPeripheralUsageDescription(Swift 3对应的权限描述键),否则无法正常扫描和连接BLE设备。
  • 系统绑定 vs App交互:CoreBluetooth只能访问你的App曾经交互过的设备,无法获取其他App配对的BLE设备,这是苹果的隐私限制。

内容的提问来源于stack exchange,提问作者Uzzal Biswas

火山引擎 最新活动