蓝牙
在 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号