升级macOS 12后CBCentralManager无法工作 报No name or address错误
根因说明
macOS 12(Monterey)对CoreBluetooth的中心化会话管理逻辑做了重构,bluetoothd进程会对同一应用的重复CBCentralManager实例、未按规范触发的扫描请求做强制拦截,你看到的Stopping scan as there are no remaining scan agents permitted to scan日志就是会话冲突后被强制终止扫描的典型表现。
排查步骤
- 统一
CBCentralManager为全局单例:老项目多模块分别实例化CBCentralManager的写法在macOS 12下会触发会话冲突,旧会话被销毁时会连带终止新会话的扫描权限,所有蓝牙操作必须通过同一个全局单例实例发起,实例化前先确认没有未释放的旧实例。 - 调整扫描触发时机:必须等
centralManagerDidUpdateState:代理回调返回CBManagerStatePoweredOn状态后,再调用scanForPeripheralsWithServices:options:启动扫描。如果在实例初始化后立刻触发扫描,此时蓝牙状态还未就绪,会被bluetoothd直接拦截,不会抛出显式错误,仅输出[CoreBluetooth] No name or address日志。 - 校验Info.plist权限声明:即使关闭了应用沙箱,macOS 12也要求必须声明
NSBluetoothAlwaysUsageDescription权限项,仅保留旧版的NSBluetoothPeripheralUsageDescription会触发隐性权限校验不通过,不会弹出权限请求框,直接限制扫描功能。 - 清理蓝牙缓存:先执行终端命令
sudo pkill bluetoothd重启蓝牙守护进程,再删除~/Library/Preferences/com.apple.Bluetooth.plist文件后重启设备,清除历史会话和配对缓存,避免旧缓存和当前应用签名冲突。 - 确认
CBCentralManager实例持有状态:如果CBCentralManager是局部变量,会在ARC下被自动释放导致代理方法无法触发,必须将实例声明为类的强持有属性:
@property (nonatomic, strong) CBCentralManager *centralManager;
- 调整扫描参数:暂时将扫描配置中的
CBCentralManagerScanOptionAllowDuplicatesKey设置为@NO,macOS 12对重复扫描的频率限制更严格,开启允许重复上报可能会触发限流被强制停扫。
内容的提问来源于stack exchange,提问作者inexcitus
相关产品推荐
相关产品推荐

