事象
Flutterで作ったiOSアプリをAppleの審査に提出した結果、下記の理由でリジェクトされました。
差出人: Apple
2. 3 Performance: Accurate Metadata
Guideline 2.3 - Performance - Accurate Metadata
We were unable to install the app on iPad and iPhone. The UIRequiredDeviceCapabilities key in the Info.plist is set in such a way that the app will not install on an iPhone and iPad .
Next Steps
To resolve this issue, please check the UIRequiredDeviceCapabilities key to verify that it contains only the attributes required for your app features or the attributes that must not be present on the device. Attributes specified by a dictionary should be set to true if they are required and false if they must not be present on the device.
Resources
Please review the Technical Q&A 1397: Understanding the UIRequiredDeviceCapabilities key for information on the UIRequiredDeviceCapabilities key.
You may also wish to review the dictionary keys table in the "Declaring the Required Device Capabilities" section of the App Programming Guide for iOS.
この記事では試行錯誤の過程を記載しています。
途中経過よりも最終的な対処方法を知りたい方は、最後の項目対処その4まで読み飛ばしてください。
対処その1
社内のiOS開発者に伺ったところ、iOSプロジェクトを新規作成するとUIRequiredDeviceCapabilitiesはデフォルトで設定されるとのことでした。
Flutterで新規作成したプロジェクトにはこれが設定されていませんでした。
UIRequiredDeviceCapabilitiesをInfo.plistに追加して、さらにその中のアイテムにarmv7
を追加しました。
armv7を設定した理由は、iOSアプリを新規作成した際にデフォルトで設定される値がarmv7であること、またこちらの公式ドキュメントによるとarmv7は一部の機能を包含する形になっていること、この上記2点を参考にしたためです。
結果その1
再度同じ理由でリジェクトを受けました。
対処その2
シミュレーター上で問題なく動作することを動画でまとめ添付し、審査に提出したところこの問題は解決しました。
詳しくはこちら。
この投稿を参考にして、アプリが動作している動画と下記のような文言を添えてレビューチームに返信しました。
I can install the my app into emulators and physical devices.
I upload the movie that shows my app is running.
I want you to review my app again.
結果その2
再度同じ理由でリジェクトを受けました。
対処その3
社内の別のiOS開発者から得た情報で、似たような理由でリジェクトを受けた際にInfo.plistの中身をそのまま渡したら無言で承認されたことがあると伺いました。
一説によるとApp Storeのバグではないかと言われているそうです。
私も下記の文言を添えて、Info.plistを添付ファイルとしてアップロードして返信してみました。
Hello,
Thank you for your reply.
I checked my app Info.plist.
It has the UIRequiredDeviceCapabilities key in Info.plist.
I upload my Info.plist.
I want you to check it.
Best regards
結果その3
再度同じ理由でリジェクトを受けました。
対処その4
社内のFlutterアプリ開発者に伺ったところ、Flutter製のiOSアプリをストアへアップロードする際はflutter build ios --release
を実行してからでないと送れなかったことがあるとアドバイスをいただきました。
そこで、アドバイス通り上記コマンドを実行した後にArchiveを選択してバイナリをストアへアップロードして再度審査に提出しました。
結果その4
無事に審査を通過しました!
おわりに
今回の原因はアプリのビルド方法が正規の方法ではなかったことが原因による問題でした。
余談ですが、Flutter製のアプリはflutter build ios --release
でビルドしないとpubspec.yaml
で指定したアプリのversionCode
とversionName
がバイナリに反映されないようです。
今回は、各プラットフォーム標準のやり方ではなく、FlutterではFlutter独自の方法を用いるべきだということを学びました。
今後も何かしら問題が起きた際にはそこを疑ったほうがよさそうです。