iOS 13부터는 bluetooth 사용에 권한을 받도록 되었다. (이전 버전에선 권한동의 없이 접근할 수 있었다)
NSBluetoothAlwaysUsageDescription - iOS 13 부터 사용
NSBluetoothPeripheralUsageDescription - iOS 13 아래를 지원한다면 이것도 추가 필요(iOS 13 이상이면 위의 키 하나면 됨
centralManager의 생성과 동시에 앱에서 권한 허용 프롬프트를 자동으로 띄워준다.
centralManager = CBCentralManager(delegate: self, queue: nil)
delegate으로 권한 변화를 받음
권한은 허용했지만, 블루투스 자체를 꺼놓아서 사용하지 못하는 경우도 있어서 state과 authorization을 같이 검사한 후에 써야한다. central.authorization는 iOS 13 이상
extension ViewController: CBCentralManagerDelegate {
func centralManagerDidUpdateState(_ central: CBCentralManager) {
switch central.state {
case .unauthorized:
()
case .unknown:
()
case .resetting:
()
case .unsupported:
()
case .poweredOff:
()
case .poweredOn:
()
@unknown default:
()
}
print(central.state.rawValue)
if #available(iOS 13.0, *) {
switch central.authorization {
case .notDetermined:
()
case .restricted:
()
case .denied:
()
case .allowedAlways:
()
@unknown default:
()
}
print(central.authorization.rawValue)
}
}
}
poweredOn이 bluetooth 이용 가능한 상태이다.
앱 권한은 허락했지만, 폰에서 블루투스를 off한 경우 -> state은 poweredOff이고, authorization은 allowedAlways이다. 이때 bluetooth가 꺼져있으니 활성화시켜야 한다는 프롬프트는 시스템이 띄워준다.
var isBluetoothPermissionGranted: Bool {
if #available(iOS 13.1, *) {
return CBCentralManager.authorization == .allowedAlways
} else if #available(iOS 13.0, *) {
return CBCentralManager().authorization == .allowedAlways
}
// Before iOS 13, Bluetooth permissions are not required
return true
}
13.1에서 authorization이 static으로 바뀌었다.