iOS 13부터는 bluetooth 사용에 권한을 받도록 되었다. (이전 버전에선 권한동의 없이 접근할 수 있었다)

Info.plist에 넣기

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으로 바뀌었다.