iOS13からのBluetoothパーミッション

はじめに

ios13でBluetooth接続を行おうとすると以下のエラーが出てしまいBluetooth接続を行うことができません。

2019-08-20 15:33:10.272060+0900 ControllerTest[453:62756] [access] This app has crashed because it attempted to access privacy-sensitive data without a usage description.  The app's Info.plist must contain an NSBluetoothAlwaysUsageDescription key with a string value explaining to the user how the app uses this data.
(lldb) 

対処方法

Info.plistにPrivacy – Bluetooth Always Usage Descriptionを追加します。valueにはなんのためにbluetoothを使うのかを記述しておきます。

source codeで設定する場合はこんな感じです。

<dict>
	<key>NSBluetoothAlwaysUsageDescription</key>
	<string>What to use bluetooth </string>
...省略
<dict>

適当でもビルドは通りますがおそらく審査の際に適当だとリジェクトされます。

plistに追記を行うとBluetooth通信をする際に以下のようなダイアログが出力されるようになります。

許可されなかった場合のハンドリング

許可されなかった場合の判定は2つの方法があります。

1つ目はCentralManagerのAuthorizationから取得する方法です。CBManagerAuthorizationという項目がios13から追加されたのでこの値で判別することができます。拒否された時のあたいはdeniedです。

2つ目はCentralManagerのStateから取得する方法です。許可されていなかった場合unauthorizedという値が返ってきます。

アラートを出して以下のコードで設定画面に遷移して変更を促してあげるのが良いかなと思います。

if let url = URL(string: UIApplication.openSettingsURLString), UIApplication.shared.canOpenURL(url) {
   UIApplication.shared.open(url, options: [:], completionHandler: nil)
}

参考文献

CBManagerAuthorization

App-Prefs:root= を使っていたため2.5.1リジェクトされたときの対処法