在 iOS 上使用 Swift 代码扫描器找不到蓝牙设备
Cannot find Bluetooth device with Swift code scanner on iOS
我正在使用我的 iOS 应用程序与非标准蓝牙设备配对。
我发现 iPhone 仅检测特定设备 classes。测试进行了:
- 联网笔记本电脑 - class:0x02010c
- 腕表 - class:0xff0704
内置蓝牙扫描仪已成功找到这些设备。我也能和他们配对。
我正在我的应用程序中进行扫描并尝试与设备配对。不幸的是,在 Swift 中编写了我的蓝牙扫描仪后,我的 phone 没有检测到该设备。
class ViewController: UIViewController, CBCentralManagerDelegate {
//MARK: Properties
@IBOutlet weak var scanButton: UIButton!
@IBOutlet weak var devicesList: UITextView!
private var centralManager: CBCentralManager!
private var bluetoothOn: Bool!
private var scanInProgress: Bool!
//MARK: Initialization
override func viewDidLoad() {
super.viewDidLoad()
centralManager = CBCentralManager(delegate: self, queue: .main, options: [CBCentralManagerScanOptionAllowDuplicatesKey: NSNumber(value: false)])
bluetoothOn = false
scanInProgress = false
}
//MARK: Actions
@IBAction func scanDevices(_ sender: UIButton) {
if bluetoothOn && !scanInProgress {
scanInProgress = true
centralManager.scanForPeripherals(withServices: nil, options: nil)
} else {
centralManager.stopScan()
}
}
func centralManagerDidUpdateState(_ central: CBCentralManager) {
if central.state == .poweredOn {
print("Bluetooth is On")
bluetoothOn = true
}
}
func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {
let line1 = "Name : \(peripheral.name ?? "(No name)")"
let line2 = "\nRSSI : \(RSSI)"
let line3 = "\nUUID : \(peripheral.identifier)"
var lineN = ""
let lineEnd = "\n------------------------------------------------------\n"
for ad in advertisementData {
lineN.append("\nAD Data: \(ad)")
}
devicesList.text += "\n \(line1) + \(line2) + \(line3) + \(line4) + \(line5) +\(lineN) + \(lineEnd)"
print(devicesList.text as Any)
}
}
我希望我的代码能像内置系统扫描仪一样找到蓝牙设备。为什么我的扫描仪找不到设备?内置蓝牙扫描器和SwiftAPI扫描解决方案有区别吗?
我发现使用 CoreBluetooth 框架无法找到 none BLE 设备。 Apple 只是阻止了这种可能性。
唯一的选择是使用 Private API 连接我想要的任何蓝牙设备。开始的最佳解决方案是从 GitHub 获取 BeeTee 项目。它只是展示了如何使用 Private API 扫描蓝牙设备。
这个解决方案工作得很好,不幸的是,它使应用程序无法访问 AppStore。 Apple不允许这种解决方案,因此该应用程序将无法通过验证过程。
我正在使用我的 iOS 应用程序与非标准蓝牙设备配对。
我发现 iPhone 仅检测特定设备 classes。测试进行了: - 联网笔记本电脑 - class:0x02010c - 腕表 - class:0xff0704
内置蓝牙扫描仪已成功找到这些设备。我也能和他们配对。
我正在我的应用程序中进行扫描并尝试与设备配对。不幸的是,在 Swift 中编写了我的蓝牙扫描仪后,我的 phone 没有检测到该设备。
class ViewController: UIViewController, CBCentralManagerDelegate {
//MARK: Properties
@IBOutlet weak var scanButton: UIButton!
@IBOutlet weak var devicesList: UITextView!
private var centralManager: CBCentralManager!
private var bluetoothOn: Bool!
private var scanInProgress: Bool!
//MARK: Initialization
override func viewDidLoad() {
super.viewDidLoad()
centralManager = CBCentralManager(delegate: self, queue: .main, options: [CBCentralManagerScanOptionAllowDuplicatesKey: NSNumber(value: false)])
bluetoothOn = false
scanInProgress = false
}
//MARK: Actions
@IBAction func scanDevices(_ sender: UIButton) {
if bluetoothOn && !scanInProgress {
scanInProgress = true
centralManager.scanForPeripherals(withServices: nil, options: nil)
} else {
centralManager.stopScan()
}
}
func centralManagerDidUpdateState(_ central: CBCentralManager) {
if central.state == .poweredOn {
print("Bluetooth is On")
bluetoothOn = true
}
}
func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {
let line1 = "Name : \(peripheral.name ?? "(No name)")"
let line2 = "\nRSSI : \(RSSI)"
let line3 = "\nUUID : \(peripheral.identifier)"
var lineN = ""
let lineEnd = "\n------------------------------------------------------\n"
for ad in advertisementData {
lineN.append("\nAD Data: \(ad)")
}
devicesList.text += "\n \(line1) + \(line2) + \(line3) + \(line4) + \(line5) +\(lineN) + \(lineEnd)"
print(devicesList.text as Any)
}
}
我希望我的代码能像内置系统扫描仪一样找到蓝牙设备。为什么我的扫描仪找不到设备?内置蓝牙扫描器和SwiftAPI扫描解决方案有区别吗?
我发现使用 CoreBluetooth 框架无法找到 none BLE 设备。 Apple 只是阻止了这种可能性。 唯一的选择是使用 Private API 连接我想要的任何蓝牙设备。开始的最佳解决方案是从 GitHub 获取 BeeTee 项目。它只是展示了如何使用 Private API 扫描蓝牙设备。
这个解决方案工作得很好,不幸的是,它使应用程序无法访问 AppStore。 Apple不允许这种解决方案,因此该应用程序将无法通过验证过程。