BabyBluetooth 是一个专为 iOS 开发设计的蓝牙库,它基于 CoreBluetooth 框架封装,提供了简洁易用的 API,帮助开发者快速实现蓝牙设备的扫描、连接、数据传输等功能,相较于原生 CoreBluetooth 的复杂性,BabyBluetooth 大幅简化了开发流程,尤其适合初学者或需要快速集成蓝牙功能的场景,本文将从环境搭建、基础功能实现、进阶技巧及注意事项等方面,详细介绍 BabyBluetooth 的使用方法。

环境搭建与基础配置
在使用 BabyBluetooth 前,需确保开发环境满足要求:Xcode 10.0+、iOS 12.0+、Swift 5.0+,通过 CocoaPods 集成 BabyBluetooth,在项目的 Podfile 中添加以下依赖:
pod 'BabyBluetooth'
执行 pod install 后,打开 .xcworkspace 文件即可开始开发。
初始化 BabyBluetooth
在需要使用蓝牙功能的类中(如 ViewController),首先创建 BabyBluetooth 实例:
import UIKit
import BabyBluetooth
class ViewController: UIViewController {
private var babyBluetooth: BabyBluetooth!
override func viewDidLoad() {
super.viewDidLoad()
setupBabyBluetooth()
}
}
初始化与代理设置
调用 init 方法初始化 BabyBluetooth,并设置必要的代理(如 BabyBluetoothDelegate、BabyBluetoothBlock):

private func setupBabyBluetooth() {
babyBluetooth = BabyBluetooth()
babyBluetooth?.log = true // 开启日志,方便调试
babyBluetooth?.delegate = self // 设置代理
babyBluetooth?.block = self // 设置 block 回调
}
核心功能实现
扫描蓝牙设备
BabyBluetooth 提供了简单的扫描接口,支持扫描外围设备并获取设备信息,扫描前需确保蓝牙已开启(iOS 13+ 需请求 Bluetooth 权限)。
扫描设备代码示例:
babyBluetooth?.scanForPeripherals().begin()
扫描结果处理(通过 block 或代理):
-
Block 方式:
(图片来源网络,侵删)babyBluetooth?.discoverPeripherals().begin() { [weak self] peripheral, advertisementData, RSSI in guard let self = self else { return } print("发现设备: \(peripheral.name ?? "未知设备")") // 可以将设备添加到列表,供用户选择 } -
代理方式(需遵循
BabyBluetoothDelegate):func babyBluetooth(_ babyBluetooth: BabyBluetooth, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], RSSI: NSNumber) { print("设备名: \(peripheral.name ?? "未知"), 信号强度: \(RSSI)") }
连接设备
扫描到目标设备后,可通过 connect 方法建立连接:
babyBluetooth?.connect(peripheral).failure({ (peripheral, error) in
print("连接失败: \(error?.localizedDescription ?? "未知错误")")
}).success({ (peripheral) in
print("连接成功: \(peripheral.name ?? "未知设备")")
}).disconnected({ (peripheral, error) in
print("设备已断开: \(peripheral.name ?? "未知设备")")
})
服务与特征发现
连接成功后,需发现设备的服务(Service)和特征(Characteristic),这是数据传输的前提。
babyBluetooth?.discoverServices().success({ (peripheral, services) in
guard let services = services else { return }
for service in services {
print("发现服务: \(service.uuid.uuidString)")
// 发现该服务下的特征
self.babyBluetooth?.discoverCharacteristics(for: service).success({ (peripheral, characteristics, service) in
guard let characteristics = characteristics else { return }
for characteristic in characteristics {
print("发现特征: \(characteristic.uuid.uuidString)")
// 订阅特征(如果支持通知)
if characteristic.properties.contains(.notify) {
peripheral.setNotifyValue(true, for: characteristic)
}
}
})
}
})
数据读写
BabyBluetooth 封装了简单的读写接口,支持向特征写入数据或读取数据。
写入数据示例:
func writeData(to characteristic: CBCharacteristic, data: Data) {
guard let peripheral = babyBluetooth?.connectedPeripherals.first else { return }
peripheral.writeValue(data, for: characteristic, type: .withResponse)
}
// 读取数据
func readData(from characteristic: CBCharacteristic) {
guard let peripheral = babyBluetooth?.connectedPeripherals.first else { return }
peripheral.readValue(for: characteristic)
}
数据接收处理(代理或 block):
// 代理方式
func babyBluetooth(_ babyBluetooth: BabyBluetooth, didUpdateValueFor characteristic: CBCharacteristic, error: Error?) {
if let error = error {
print("读取数据失败: \(error.localizedDescription)")
return
}
if let data = characteristic.value {
print("接收数据: \(data.hexString)") // 可扩展 Data 的 hexString 转换方法
}
}
进阶技巧与注意事项
蓝牙状态管理
BabyBluetooth 提供了蓝牙状态监听功能,可实时获取蓝牙开关状态:
babyBluetooth?.updateDelegate(self) // 需遵循 `BabyBluetoothDelegate`
func babyBluetoothDidUpdateState(_ babyBluetooth: BabyBluetooth) {
switch babyBluetooth.state {
case .poweredOn:
print("蓝牙已开启,可开始扫描")
case .poweredOff:
print("蓝牙已关闭")
case .resetting:
print("蓝牙正在重置")
case .unauthorized:
print("未授权蓝牙权限")
case .unsupported:
print("设备不支持蓝牙")
case .unknown:
print("蓝牙状态未知")
@unknown default:
break
}
}
设备连接管理
当需要连接多个设备或管理已连接设备时,可通过以下方法:
// 获取已连接设备 let connectedDevices = babyBluetooth?.connectedPeripherals // 断开指定设备 babyBluetooth?.cancelAllPeripheralsConnection() babyBluetooth?.cancelPeripheralConnection(peripheral)
数据解析与封装
蓝牙传输的数据通常为 Data 类型,需根据设备协议解析,将十六进制字符串转换为 Data:
extension Data {
var hexString: String {
return map { String(format: "%02hhx", $0) }.joined()
}
}
// 字符串转 Data
func dataFromHexString(hexString: String) -> Data {
var data = Data()
var hex = hexString
if hex.count % 2 != 0 {
hex = "0" + hex
}
for i in stride(from: 0, to: hex.count, by: 2) {
let subString = hex.substring(with: i..<i+2)
if let byte = UInt8(subString, radix: 16) {
data.append(byte)
}
}
return data
}
注意事项
- 权限申请:iOS 13+ 需在
Info.plist中添加NSBluetoothAlwaysUsageDescription,并在运行时请求Bluetooth权限。 - 线程安全:蓝牙操作需在主线程执行,避免回调方法在子线程中更新 UI。
- 设备兼容性:不同设备的蓝牙协议可能存在差异,需提前与硬件厂商确认服务和特征的 UUID。
相关问答 FAQs
Q1:BabyBluetooth 和 CoreBluetooth 有什么区别?
A:BabyBluetooth 是基于 CoreBluetooth 的封装库,简化了原生框架的复杂操作,CoreBluetooth 提供底层接口,需要手动处理扫描、连接、服务发现等逻辑,代码量较大;而 BabyBluetooth 通过链式调用和 block/代理回调,将复杂流程封装为简单方法,适合快速开发,但灵活性稍低,对于需要高度定制化蓝牙功能的场景,建议直接使用 CoreBluetooth;对于常规需求,BabyBluetooth 能大幅提升开发效率。
Q2:如何处理蓝牙连接超时或断开问题?
A:可通过以下方式优化:
- 设置连接超时:使用
DispatchSource定时器,若连接超过指定时间未成功,则手动调用cancelPeripheralConnection断开连接。 - 监听断开事件:通过
disconnected回调或代理方法捕获断开事件,分析错误原因(如信号弱、设备关闭等),并提示用户重新连接。 - 重连机制:在断开回调中实现自动重连逻辑,但需注意控制重连次数,避免频繁连接导致设备异常。
var reconnectCount = 0 let maxReconnectCount = 3
func babyBluetooth(_ babyBluetooth: BabyBluetooth, disconnected peripheral: CBPeripheral, error: Error?) {
if reconnectCount < maxReconnectCount {
DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
self.babyBluetooth?.connect(peripheral)
reconnectCount += 1
}
} else {
print("重连次数已达上限,请手动连接")
reconnectCount = 0
}
}
开发者可以快速掌握 BabyBluetooth 的核心功能,并解决实际开发中常见的问题,结合具体硬件协议和业务逻辑,即可高效实现蓝牙通信功能。 