藍牙
在 iOS 開發中,Bluetooth(藍牙)功能主要通過 CoreBluetooth 框架實現。CoreBluetooth 是 iOS 自帶的藍牙通信框架,常用于 BLE(Bluetooth Low Energy)設備的通信。以下是對 iOS Bluetooth 開發的詳細講解,包括基礎概念、開發流程以及常見問題。
一、基礎概念
1. BLE(藍牙低功耗)
- BLE 是藍牙的一種協議,專注于低功耗設備間的數據通信。
- BLE 的工作模式主要有兩種:
- Central(中心設備): 負責掃描和連接外圍設備。
- Peripheral(外圍設備): 負責廣播數據,供中心設備發現和連接。
2. CoreBluetooth 框架
CoreBluetooth 是 iOS 提供的藍牙框架,支持 BLE 功能。它主要包括以下核心類:
- CBCentralManager: 用于管理中心設備,掃描和連接外圍設備。
- CBPeripheral: 表示連接的外圍設備,負責與設備進行通信。
- CBService: 外圍設備提供的服務(功能集合)。
- CBCharacteristic: 服務中的特性,表示具體的數據或操作的接口。
二、開發流程
1. 初始化藍牙中心設備(Central)
中心設備負責掃描和連接藍牙外圍設備。
SWIFT
import CoreBluetooth class BluetoothManager: NSObject, CBCentralManagerDelegate { var centralManager: CBCentralManager! override init() { super.init() // 初始化藍牙中心管理器 centralManager = CBCentralManager(delegate: self, queue: nil) } // 檢查藍牙狀態 func centralManagerDidUpdateState(_ central: CBCentralManager) { switch central.state { case .poweredOn: print("藍牙已開啟,可以開始掃描設備") case .poweredOff: print("藍牙未開啟,請打開藍牙") case .unsupported: print("設備不支持藍牙功能") default: print("藍牙狀態未知") } } } 顯示全部 (26)
2. 掃描外圍設備
使用 CBCentralManager 的 scanForPeripherals 方法掃描附近的 BLE 設備。
SWIFT
// 開始掃描設備 func startScanning() { centralManager.scanForPeripherals(withServices: nil, options: nil) } // 發現設備時的回調 func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) { print("發現設備: \(peripheral.name ?? "未知設備")") // 停止掃描并連接設備 centralManager.stopScan() centralManager.connect(peripheral, options: nil) } 3. 連接外圍設備
當掃描到設備后,可以使用 connect 方法連接設備。
SWIFT
var connectedPeripheral: CBPeripheral? // 連接設備成功的回調 func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) { print("成功連接設備 \(peripheral.name ?? "未知設備")") connectedPeripheral = peripheral peripheral.delegate = self // 掃描設備的服務 peripheral.discoverServices(nil) } // 連接失敗的回調 func centralManager(_ central: CBCentralManager, didFailToConnect peripheral: CBPeripheral, error: Error?) { print("連接設備失敗: \(error?.localizedDescription ?? "未知錯誤")") } 顯示全部 (16)
4. 發現服務和特性
外圍設備通過服務和特性提供功能,連接后可以掃描服務和特性以獲取具體數據。
SWIFT
// 發現服務的回調 func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?) { if let error = error { print("掃描服務失敗: \(error.localizedDescription)") return } // 遍歷所有服務 for service in peripheral.services ?? [] { print("發現服務: \(service.uuid)") // 掃描服務的特性 peripheral.discoverCharacteristics(nil, for: service) } } // 發現特性的回調 func peripheral(_ peripheral: CBPeripheral, didDiscoverCharacteristicsFor service: CBService, error: Error?) { if let error = error { print("掃描特性失敗: \(error.localizedDescription)") return } for characteristic in service.characteristics ?? [] { print("發現特性: \(characteristic.uuid)") // 讀取特性數據 peripheral.readValue(for: characteristic) } } 顯示全部 (29)
5. 與特性交互
特性是服務的具體功能接口,可以通過特性讀取數據或寫入數據。
SWIFT
// 讀取特性數據的回調 func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor characteristic: CBCharacteristic, error: Error?) { if let error = error { print("讀取特性數據失敗: \(error.localizedDescription)") return } if let value = characteristic.value { print("特性數據: \(value)") } } // 寫入數據到特性 func writeData(to characteristic: CBCharacteristic, data: Data) { connectedPeripheral?.writeValue(data, for: characteristic, type: .withResponse) } 顯示全部 (17)
三、常見問題及解決方案
1. 藍牙權限問題
在 iOS 13+,必須在 Info.plist 文件中聲明藍牙使用權限:
XML
<key>NSBluetoothAlwaysUsageDescription</key> <string>需要訪問藍牙以連接設備</string> 如果不聲明權限,應用可能無法正常掃描設備。
2. 藍牙狀態檢查
確保藍牙狀態為 .poweredOn 才能開始掃描設備,否則可能會報錯。
SWIFT
if centralManager.state != .poweredOn { print("藍牙未開啟,無法掃描設備") } 3. 特性交互失敗
特性必須支持操作(如 read 或 write),才能與其交互。
SWIFT
if characteristic.properties.contains(.read) { peripheral.readValue(for: characteristic) } else { print("該特性不支持讀取操作") } 4. 連接斷開
設備可能會意外斷開連接,需要處理斷開事件并嘗試重新連接。
SWIFT
func centralManager(_ central: CBCentralManager, didDisconnectPeripheral peripheral: CBPeripheral, error: Error?) { print("設備斷開連接: \(error?.localizedDescription ?? "未知原因")") // 嘗試重新連接 centralManager.connect(peripheral, options: nil) } 四、最佳實踐
- 優化掃描方式:
- 使用
withServices參數指定需要掃描的設備服務 UUID,減少掃描范圍。
- 使用
- 高性能寫入特性:
- 使用
.withoutResponse寫入特性數據時,可提高寫入性能,但需確保設備支持無響應寫入。
- 使用
- 維護連接狀態:
- 監控設備的連接狀態,并在斷開時及時重連。
- 安全性:
- 使用加密特性或設備認證機制保護藍牙通信數據。

浙公網安備 33010602011771號