App蓝牙权限弹窗一直有问题,最近做了修复做下记录:
开发环境 Xcode14.2 swift 5.0 CoreBluetooth
蓝牙主要有2个参数状态
CBManager 下的 state 和 authorization
state
public enum CBManagerState : Int, @unchecked Sendable {
case unknown = 0 //未知状态,即将更新
case resetting = 1 //与系统服务的连接暂时丢失,即将更新
case unsupported = 2 // 该平台不支持低功耗蓝牙中央/客户端角色 (还没遇到过)
case unauthorized = 3 // 该应用程序未被授权使用低功耗蓝牙角色 (拿到这个情况的时候 肯定是用户禁止了你的蓝牙权限 要弹窗 设置权限;)
case poweredOff = 4 // 蓝牙关闭 (关闭了蓝牙或者在控制中心关闭了蓝牙连接的时候 你获取到的是这个状态 )
case poweredOn = 5 // 蓝牙打开并且可以连接 (可以愉快的开始开发了)
}
authorization 13.0 到 13.1 是实例方法;13.1 之后是类方法
public enum CBManagerAuthorization : Int, @unchecked Sendable {
case notDetermined = 0 // 用户还没做出选择
case restricted = 1 // 此应用程序无权使用蓝牙。 用户无法更改此应用程序的状态,这可能是由于活动限制(例如家长控制到位)所致。
case denied = 2 // 用户已明确拒绝此应用程序使用蓝牙。 对应用授权不允许(在此种状态下拿到的 state 是 unauthorized 并不能知道当前蓝牙是打开还是关闭的)
case allowedAlways = 3 // 用户已授权此应用程序始终使用蓝牙 (可以愉快的开始开发了)
}
蓝牙可能的系统弹窗
- 授权弹窗 应用访问蓝牙的时候会去进行授权弹窗 第一次安装使用蓝牙的时候弹出 在Info.plist 配置权限
说明: 必弹出 - 提示打开蓝牙的弹窗
跟 CBCentralManagerOptionShowPowerAlertKey 这个Key 有关系
如果在实例化 CBCentralManager 时蓝牙关闭,系统应该显示给用户的警告对话框,弹出一次
说明:可以关闭 关闭方法 在初始化CBCentralManager 设置options(见下面) 关闭之后 需要自己弹窗了
CBCentralManagerOptionShowPowerAlertKey 默认 是 true 设置成 false 就不提示了
CBCentralManager(delegate: self, queue: DispatchQueue.main, options: [CBCentralManagerOptionShowPowerAlertKey: false])
蓝牙权限流程图
如果你想先检查蓝牙的状态 state;
- 当是 poweredOn 或者 poweredOff 的时候,你已经肯定得到了授权;
- 当是 unauthorized 的时候 证明用户关闭了你的蓝牙授权权限,这时候 你是肯定不知道蓝牙是开启还是关闭的,要先请求权限,获取权限之后,再判断 是poweredOn 或者 poweredOff