はじめに
最近ARKitを使ったAR Cake Dividerというアプリをリリースしました。しかし、初回のリリース時にApple Human Interface GuidelinesのResuesting Permission(以下AHIG)に準拠していないという事でリジェクトを受けました。ARアプリを作る上でCamera Permissionは必須になりますが、XcodeのデフォルトARプロジェクトではAHIGに準拠した形のパーミッション要求を出してくれません。
アプリ作成の度に修正をするのは面倒なのでテンプレートプロジェクトを作成してGitHubで公開しました。
AHIGのResuesting Permissionの要点
- アプリは位置情報や連絡先などの情報へのアクセスを、ユーザーがコントロールできる様にするべき
- 情報へのアクセス要求はユーザにとって、明らかにアプリがその情報が必要だとわかるときに行うべき
- アクセス要求時にシステムから表示されるダイアログには、短く明快になぜアプリはその情報が必要なのか書くべき
この中でどれも重要なのですが、2番目は「アプリがその情報にアクセスできなければ動作できないのであれば、ちゃんと要求を出さなければいけない」ということも意味しています。
具体的には、例えばあるカメラアプリが起動時にカメラを起動させるとして、起動前にパーミッション要求を行ったとします。
一度ユーザが「許可しない」を選択したとして、その後アプリを再起動させました。
そのときアプリは一度パーミッション取得できなかったため、再び要求を出さずそのまま状態だったとします。
これはアプリがその情報が必要なときに要求を行っていないとみなされます。アプリがその情報にアクセスできなければ動作できないのであれば、再度要求を出すことが求められます。
テンプレートプロジェクトのポイント
以上の点を踏まえてテンプレートプロジェクトでは次の機能を実装しています。
-
アプリは初回起動時に自分がCamera Permissionを持っているか確認する
⇨let cameraAuthorizationStatus = AVCaptureDevice.authorizationStatus(for: .video)
-
初回起動時の判定に基づいて、アプリがForegroundになったタイミングで
- Camera Permissionを持っていなければ要求を出す⇨
requestCameraPermission()
- Camera Permissionをユーザに断られていたら、アプリの動作に必要な旨のダイアログを表示し、設定アプリへ誘導する⇨
alertCameraAccessNeeded()
そのために、UIApplication.willEnterForegroundNotificationを監視する。
⇨NotificationCenter.default.addObserver(self, selector: #selector(checkPermission), name: UIApplication.willEnterForegroundNotification, object: nil)
- Camera Permissionを持っていなければ要求を出す⇨
-
ユーザが理解し易い様にダイアログのメッセージは国際化する
⇨ InfoPlist.strings、Localizable.strings