You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Swift(CoreBluetooth)中实现类似Android addManufacturerData的厂商特定BLE广播功能?

如何在Swift(CoreBluetooth)中实现类似Android addManufacturerData的厂商特定BLE广播功能?

我来帮你搞定这个问题!首先可以明确告诉你:iOS完全支持BLE厂商特定数据广播,你看到的那篇十年前的帖子早就过时了,不用理它。你之前的代码问题出在数据构造和字典key的使用上,咱们一步步来修正。

核心问题分析

你之前的代码错误地把payload放到了CBAdvertisementDataLocalNameKey里,这完全不符合需求——而且你要的是不广播设备名称(对应Android的setIncludeDeviceName(false)),所以这个key根本不应该出现在你的广播字典里。另外,厂商特定数据的格式你没搞对,iOS要求把「16位厂商ID(小端字节序)」和「自定义payload」拼接成一个Data对象,作为CBAdvertisementDataManufacturerDataKey的值。

正确实现步骤

1. 先确保BLE外设管理器状态正常

在iOS里,必须等CBPeripheralManager的状态变为.poweredOn才能启动广播,这是新手很容易忽略的点。

2. 正确构造厂商特定数据

BLE的厂商特定数据格式是固定的:

  • 前2字节:16位厂商ID(小端字节序,也就是低字节在前)
  • 后续字节:你的自定义payload数据

3. 构造广播字典并启动广播

只需要包含CBAdvertisementDataManufacturerDataKey这一个key,不要加设备名称相关的key,就和Android的setIncludeDeviceName(false)效果一致。

完整示例代码

import CoreBluetooth

class BLEAdvertiser: NSObject, CBPeripheralManagerDelegate {
    private var peripheralManager: CBPeripheralManager!
    // 替换成你从Bluetooth SIG拿到的16位厂商ID
    private let yourManufacturerID: UInt16 = 0x1234 
    // 你的自定义字节数组,替换成实际业务需要的数据
    private let customPayload: Data = Data([0x01, 0x02, 0x03, 0x04]) 

    override init() {
        super.init()
        // 初始化外设管理器,主线程队列处理代理回调
        peripheralManager = CBPeripheralManager(delegate: self, queue: DispatchQueue.main)
    }

    // 监听BLE状态变化
    func peripheralManagerDidUpdateState(_ peripheral: CBPeripheralManager) {
        switch peripheral.state {
        case .poweredOn:
            startCustomAdvertising()
        case .poweredOff:
            print("BLE已关闭,请打开蓝牙")
        case .unauthorized:
            print("没有BLE权限,请在设置中开启")
        default:
            print("BLE状态异常:\(peripheral.state.rawValue)")
        }
    }

    // 启动自定义广播
    private func startCustomAdvertising() {
        var manufacturerData = Data()
        
        // 把厂商ID转成小端字节序的Data
        withUnsafeBytes(of: yourManufacturerID.littleEndian) {
            manufacturerData.append(contentsOf: $0)
        }
        // 拼接自定义payload
        manufacturerData.append(customPayload)

        // 构造广播字典:只包含厂商特定数据,不广播设备名
        let advertisementDict: [String: Any] = [
            CBAdvertisementDataManufacturerDataKey: manufacturerData
        ]

        // 开始广播
        peripheralManager.startAdvertising(advertisementDict)
    }

    // 监听广播启动结果
    func peripheralManager(_ peripheral: CBPeripheralManager, didStartAdvertising error: Error?) {
        if let error = error {
            print("广播启动失败:\(error.localizedDescription)")
            // 常见错误:广播数据总长度超过31字节(BLE广播包的最大限制)
        } else {
            print("厂商特定数据广播已启动")
        }
    }
}

关键注意事项

  • 字节序问题:一定要用littleEndian处理厂商ID,这样才能和Android的addManufacturerData生成的广播包格式完全一致,保证跨平台兼容性。
  • 广播包长度限制:BLE广播包的总字节数不能超过31字节,所以你的厂商ID(2字节)加上payload的长度不能超过29字节,否则会启动广播失败。
  • 权限配置:别忘了在Info.plist中添加NSBluetoothAlwaysUsageDescription或者NSBluetoothPeripheralUsageDescription(根据iOS版本),否则App会没有BLE权限。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.07 07:34:33