我用我的iPhone应用程序CoreBluetooth框架进行扫描并连接到其他蓝牙设备。我能够成功地扫描使用下面的代码的设备:
var centralManager: CBCentralManager?
var peripherals = [CBPeripheral]()
centralManager = CBCentralManager(delegate: self, queue: DispatchQueue.main)
在CBCentralManagerDelegate,我实现下面的代码:
extension ViewController: CBCentralManagerDelegate {
func centralManagerDidUpdateState(_ central: CBCentralManager) {
if (central.state == .poweredOn){
self.centralManager?.scanForPeripherals(withServices: nil, options: nil)
}
}
func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {
if !peripherals.contains(peripheral) {
let localName = advertisementData[CBAdvertisementDataLocalNameKey]
print("\(String(describing: localName))" )
peripherals.append(peripheral)
tableView.reloadData()
}
}
}
从上面的代码中的localName始终是零。我失去了任何的代码? 要添加更多的信息, 当我在扫描我的Mac蓝牙设备,我能看到设备的名称。但是,当我在扫描我的iPhone蓝牙设备,他们没有被列出。 我过检查,并确信,我启用蓝牙的4台设备与我(的iPad,2个Android手机和Android的1 TV)
我在你的代码只是名字的来源发生变化 - 而不是:
let localName = advertisementData[CBAdvertisementDataLocalNameKey]
我用:
let localName = peripheral.name
现在我看到周围的BLE装置名称。
斯威夫特与蓝牙核心库:
func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber){
let peripheralLocalName_advertisement = ((advertisementData as NSDictionary).value(forKey: "kCBAdvDataLocalName")) as? String
if (((advertisementData as NSDictionary).value(forKey: "kCBAdvDataLocalName")) != nil)
print(peripheralLocalName_advertisement)//peripheral name from advertismentData
print(peripheral.name)//peripheral name from peripheralData
peripherals.append(peripheral)
arrayPeripheral.append(advertisementData)
}
}