【Flutter】多言語対応アプリのiOSのスクショを効率的に取得する

Flutter

こんにちは。趣味グラマのNobu(@nm_aru)です。

Flutterで個人開発しているアプリですが、遂にアプリ本体は完成し、リリースのための準備に入りました。

今回は欲張って日英中韓の4ヶ国語対応を行ったのですが、リリース準備の段階で地獄を見る事に…。

その中の試行錯誤で、iOSのスクリーンショットを効率的に取る方法を編み出した(?)ので共有したいと思います。

iOSは用意するスクリーンショットの種類が多い

Appleのドキュメントにある通り、App Storeでアプリを配信するために用意しなければいけないスクリーンショットは、2021年6月現在で最低以下の4種類が必要になります。

  1. 6.5インチ iPhone用(例:iPhone12 Pro Max)
  2. 5.5インチ iPhone用(例:iPhone8 Plus)
  3. 12.9インチ iPad Pro(第3〜4世代)
  4. 12.9インチ iPad Pro(第2世代)
https://help.apple.com/app-store-connect/#/devd274dd925

この4種類だけなら、地道に取得すれば良いのですが、これに多言語対応が入ってくると途端に地獄になりました…。

多言語対応の時のスクショ取得の問題点

多言語対応アプリのスクリーンショットを取る場合、以下の手順を各言語毎に繰り返す必要があります。

  1. iOSシミュレータの言語設定を対象言語に変更する
  2. アプリを起動する
  3. 各言語に対応したコンテンツを登録する(必要な場合)
  4. スクリーンショットを取得する

ここで問題になるのが、3の「各言語に対応したコンテンツを登録する」です。

先に示した通り、App Store用のスクリーンショットは4種類の端末分取得する必要があります。

そこに多言語対応を掛け合わせると、対応言語数 × 4端末になり、例えば私の今回のアプリの場合、4ヶ国語(日英中韓)× 4端末で16回の取得が必要になり、上記の3の作業も16回行う必要が出てきます。

これは大変な苦痛です(少なくとも私にとっては)

試行錯誤の結果、編み出した解決策

問題は、4種類のシミュレータ毎に各言語のコンテンツを登録しなければいけない事でした。

登録したコンテンツはSQLiteに保存しており、SQLiteのファイルは、何も指定しなければ以下のようにシミュレータ配下(?)に作られます。

/Users/hoge/Library/Developer/CoreSimulator/Devices/06B8EF5B-B6C4-4834-85F0-2F39B069E172/data/Containers/Data/Application/54DF4742-6F30-45B9-987F-A0D5987FADE1/Documents/database.sqlite

シミュレータが変わればDevicesの後ろのIDが変わり、アプリを再インストールすれば、Applicationの後ろのIDが変わります。

そして、このパスを見ていてふと気付きました。

言語毎に別の場所(/tmp配下とか)にSQLiteのファイルを用意し、4種類のシミュレータから同じSQLiteファイルにアクセスすれば良いのでは?と。

言語毎にSQLiteファイルを用意する

早速、以下のように言語毎にSQLiteファイルの保存先を指定し、1つのシミュレータでアプリからコンテンツを登録後、残り3種類のシミュレータを同時に起動してみたところ、見事に同じコンテンツを各シミュレータで確認する事が出来ました。

スクリーンショットはコマンドラインで取得する

複数のシミュレータでスクリーンショットを取得する場合、以下のようにコマンドラインから取得した方が楽です。

xcrun simctl io [device] screenshot --mask alpha screenshot.png

[device]の部分は、flutter devicesを実行する事で取得できます。

[hoge@:~]$ flutter devices
3 connected devices:

iPhone 8 Plus (mobile)     • 07B8EF5B-B6C4-4834-85F0-2F39B069E172 • ios            • com.apple.CoreSimulator.SimRuntime.iOS-14-5 (simulator)
iPhone 12 Pro Max (mobile) • 2A3CDA6C-CB34-4B1A-AA5E-4BBF927A333C • ios            • com.apple.CoreSimulator.SimRuntime.iOS-14-5 (simulator)
Chrome (web)               • chrome                               • web-javascript • Google Chrome 91.0.4472.77

この中の07B〜、2A3〜の部分です。

私の場合は、[device]を固定した上で、アプリを画面遷移させたら、ファイル名だけ変えてコマンド実行という形で取得していました。

まとめ

多言語対応には、色々と地道な作業があるんだなと実感…。

企業で出す場合は、誰かがやってくれている事でも、個人開発だと全て自分で行う必要があるので、勉強になりますね(前向き)

コメント

タイトルとURLをコピーしました