iOS Custom Keyboard Extension访问蓝牙CBCentralManager.unsupported问题求助
自定义键盘扩展CBCentralManager返回.unsupported问题解决方案
出现该问题是自定义键盘扩展的权限限制和代码初始化逻辑共同导致的,按以下步骤排查修改即可:
- 权限配置补全
- 自定义键盘扩展的
info.plist需要单独配置蓝牙权限描述字段:iOS 13及以上版本加NSBluetoothAlwaysUsageDescription,iOS 12及更低版本加NSBluetoothPeripheralUsageDescription,字段值填你申请蓝牙权限的用途说明。 - 确认
info.plist层级NSExtension -> NSExtensionAttributes下的RequestsOpenAccess为布尔值YES,确保权限层级配置正确。 - 进入扩展Target的「Signing & Capabilities」页面,单独为扩展添加「Bluetooth」权限(iOS 14+必填),不要仅在宿主App中添加。
- 自定义键盘扩展的
- 权限判断逻辑补充
自定义键盘必须在用户开启完全访问后才能调用蓝牙能力,未开启完全访问时系统会直接返回.unsupported状态,你需要在初始化蓝牙前先判断完全访问权限:override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) guard self.hasFullAccess else { // 可自行添加引导用户开启完全访问的逻辑 print("未开启完全访问,无法调用蓝牙") return } manager = BLManager.shared } - 蓝牙初始化逻辑修正
你当前初始化CBCentralManager时先传了空代理,后续再赋值代理,可能会错过系统触发的首次状态回调,导致状态识别错误,修改BLManager的初始化逻辑:override init() { super.init() // 初始化时直接传入代理,不要后续赋值 manager = CBCentralManager(delegate: self, queue: DispatchQueue.global()) }
完成以上修改后如果仍有问题,可以先将蓝牙逻辑放到宿主App中运行,排除蓝牙本身硬件关闭、代码逻辑错误等问题,再排查扩展侧的配置。
内容的提问来源于stack exchange,提问作者CodingT
相关产品推荐
相关产品推荐

