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

如何在iOS外设上通过CoreBluetooth设置广播与扫描响应载荷

iOS CoreBluetooth实现BLE外设广播(对应Android AdvertiseData功能)

CoreBluetooth完全支持实现你在Android端的BLE广播需求,包括设置服务UUID、自定义服务数据,以及自动处理广播载荷与扫描响应的拆分,只是配置逻辑与Android有所不同。

核心实现步骤与代码示例

1. 初始化CBPeripheralManager并配置广播

通过CBPeripheralManager的广播参数字典,使用官方定义的key来配置服务UUID和服务数据,无需手动拆分广播与扫描响应(系统会自动处理载荷溢出,将超出广播包容量的内容放到扫描响应中):

import CoreBluetooth

class BLEPeripheralHandler: NSObject, CBPeripheralManagerDelegate {
    private var peripheralManager: CBPeripheralManager!
    // 替换为你的目标服务UUID
    private let targetServiceUUID = CBUUID(string: "YOUR_SERVICE_UUID")
    // 替换为你要广播的自定义数据
    private let serviceData = "YourCustomData".data(using: .utf8)!
    
    override init() {
        super.init()
        // 初始化外设管理器
        peripheralManager = CBPeripheralManager(delegate: self, queue: DispatchQueue.main)
    }
    
    // 外设状态更新回调
    func peripheralManagerDidUpdateState(_ peripheral: CBPeripheralManager) {
        guard peripheral.state == .poweredOn else {
            print("BLE外设未就绪,状态:\(peripheral.state.rawValue)")
            return
        }
        
        // 创建并添加服务(无需特征,仅用于广播)
        let service = CBMutableService(type: targetServiceUUID, primary: true)
        peripheralManager.add(service)
        
        // 配置广播参数
        let advParameters: [String: Any] = [
            // 广播服务UUID,对应Android的addServiceUuid
            CBAdvertisementDataServiceUUIDsKey: [targetServiceUUID],
            // 广播服务数据,对应Android的addServiceData
            CBAdvertisementDataServiceDataKey: [targetServiceUUID: serviceData],
            // 可选:设置设备本地名,不需要可移除
            // CBAdvertisementDataLocalNameKey: "iOS_BLE_Peripheral"
        ]
        
        // 启动广播
        peripheralManager.startAdvertising(advParameters)
    }
    
    // 广播启动状态回调
    func peripheralManagerDidStartAdvertising(_ peripheral: CBPeripheralManager, error: Error?) {
        if let error = error {
            print("广播启动失败:\(error.localizedDescription)")
        } else {
            print("BLE广播已成功启动")
        }
    }
}

针对你遇到问题的说明

  • 问题1:仅能设置本地名,Android无法获取服务数据
    你之前未配置CBAdvertisementDataServiceUUIDsKey和CBAdvertisementDataServiceDataKey这两个核心参数,导致广播包中仅包含设备名,添加上述参数后Android端扫描时即可获取服务UUID和对应数据。

  • 问题2:需建立连接才能访问特征
    广播中的服务UUID和服务数据属于广播载荷,无需建立连接即可被扫描到,无需创建并暴露特征,仅需将服务添加到CBPeripheralManager即可。

  • 问题3:使用overflow key或非法字典映射触发异常
    必须使用CoreBluetooth官方定义的CBAdvertisementDataServiceUUIDsKey和CBAdvertisementDataServiceDataKey,自定义key或错误的映射类型会触发异常,官方key的类型要求分别是[CBUUID]和[CBUUID: Data]。

  • 问题4:设置deviceLocalName非理想方案
    设备本地名是可选配置,完全可以移除该key,仅保留服务相关参数即可实现需求。

关键差异说明

与Android手动拆分广播载荷和扫描响应不同,iOS CoreBluetooth会自动根据BLE广播包的容量限制,将超出部分的服务信息放到扫描响应包中,无需开发者手动配置扫描响应数据,Android端扫描时会自动获取完整的广播与扫描响应内容。

内容的提问来源于stack exchange,提问作者vharsh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 21:01:55