Xcode 8.0でUnknottingアプリの新バージョンをiTunes Connectにアップロードすると、次のようなメールが届いた。
We have discovered one or more issues with your recent delivery for "Unknotting". To process your delivery, the following issues must be corrected:
This app attempts to access privacy-sensitive data without a usage description. The app's Info.plist must contain an NSMicrophoneUsageDescription key with a string value explaining to the user how the app uses this data.
Once these issues have been corrected, you can then redeliver the corrected binary.
アップロードしたバイナリが審査前の段階で却下されたことがわかる。
原因は、ユーザーのプライバシーに抵触するおそれのある情報へのアクセスに対する説明が無いことであり、具体的にはNSMicrophoneUsageDescriptionがinfo.plistに含まれていないことだとある。確かにUnknottingでは音声認識のためにマイクを使用している。
Unknottingでは、マイク以外にもユーザーのプライバシーに抵触するおそれのある情報へのアクセスを行っている。位置情報の使用である。このため、
NSLocationAlwaysUsageDescription=" 許可が無いと、アプリがバックグラウンドにあるときにはノットをほどけません。";
という内容をinfoPlist.stringsに定義してあり、このメッセージが位置情報の初回使用時に画面に表示されている。そして本アプリのinfoPlist.stringsには、NSMicrophoneUsageDescriptionも定義してあるのである。
NSMicrophoneUsageDescription=" 使用許可が無い場合は音声認識機能が使えません。";
アプリの音声認識機能(SiriではなくOpenEarsを利用している)を初めて使うときには、上記のメッセージが画面に正しく表示される。すなわち、Unknottingアプリには、NSMicrophoneUsageDescriptionが定義されており、その内容はアプリで正常に利用されている。だから、Apple社から届いた問題点を指摘するメールには首を傾げざるを得なかった。
結論から言えば、NSMicrophoneUsageDescriptionはinfoPlist.stringsに定義しておくだけでは不十分であり、info.plist内に明示的に記述しておく必要があるのだった。実際にアプリで記述内容を使用する際には、日本語版と英語版を用意してあるinfoPlist.stringsの内容に置きかえられるのだろうから、info.plistでのNSMicrophoneUsageDescriptionに対する値は空文字でよかろうと思ったが、これも却下された。英語版の記述を冗長だが書いておいたところ、アプリは無事にアップロードが許可され、日本語環境でアプリを実行したところ、infoPlist.stringsの内容が表示された。
解せないのは、他のプライバシー関連情報へのアクセスについてである。NSMicrophoneUsageDescriptionで上記のような対応をする必要があるのであれば、NSLocationAlwaysUsageDescriptionでも同様かと思いきや、これについてはinfoPlist.stringsに説明文を記述しておくだけで十分なのであった。