
はじめに
個人開発しているiOSアプリを多言語対応しました。
アプリ内の文言を各言語に置き換える作業自体は、i18nライブラリを入れて翻訳リソースを用意すれば、問題なく進みます。
しんどかったのはそこではなく、App Store Connect に登録するもののほうでした。
結論からいうと、以下の2つで大部分を自動化できます。
xcrun simctl… Xcodeに付属している、iOSシミュレータを操作するコマンドラインツールfastlane deliver… App Store Connect の掲載情報とスクリーンショットを一括反映するツール
今回はその流れについて共有したいと思います。
※本記事では具体的な実装例までは踏み込まず、全体の流れと考え方が中心となります。実際に詰まった箇所については、機会があれば別途書きたいと思っております。
多言語対応で何が大変だったのか
スクリーンショットが掛け算で増える
一番わかりやすい問題がこれでした。
必要なスクリーンショットは 言語数 × 画面数 で増えていきます。仮に7言語・5画面だとすると、それだけで35枚です。
日本語だけだった頃は5枚を手で撮って終わりだったので、正直このあたりの見積もりはかなり甘く見ていました。
しかも「ただ撮ればいい」わけではありません。
インストール直後のまっさらな状態で撮ると、当然ながら中身が空っぽの寂しい画面になります。ストアに並べるものとしては、ある程度データが入っていて、機能が伝わる状態である必要があります。
つまり1言語ごとに、
- アプリの表示言語を切り替える
- 見栄えのするデータを用意する
- 目的の画面まで遷移する
- 撮る
これを画面数ぶん繰り返し、さらに言語数ぶん繰り返すことになります。手作業でやると、後半はもう何をしているのかわからなくなってきます。。。
掲載情報も掛け算で増える
そしてもう一つ、見落としていたのがこちらでした。
App Store Connect に登録する項目は、スクリーンショットだけではありません。1つの言語につき、ざっとこれだけあります。
| 項目 | 補足 |
|---|---|
| アプリ名 | 30文字以内 |
| サブタイトル | 30文字以内 |
| 説明文 | 4,000文字以内 |
| キーワード | 100文字以内・カンマ区切り |
| プロモーション用テキスト | 170文字以内 |
| このバージョンの新機能 | |
| サポートURL | |
| マーケティングURL | |
| プライバシーポリシーURL |
9項目 × 7言語で63項目です。これを管理画面でポチポチ切り替えながら貼り付けていくのは、考えただけでしんどい作業でした。
一番きついのは「やり直し」
そして個人的に一番こたえたのがこれでした。
UIをほんの少し直しただけで、35枚すべてが作り直しになるということです。
ボタンの位置を数ピクセル変えた、余白を調整した、といった小さな変更でも、掲載中の画像と実物がずれてしまいます。そうなると「直したいけど、また35枚撮り直しか。。。」という思考になり、UIの改善そのものに心理的なブレーキがかかるようになってきます。
これは良くない状態だと感じました。
自動化できないか?
そこで、この作業を分解して考えてみることにしました。
整理してみると、やっていることは大きく4つでした。
- 見せたい状態をアプリに作る
- 画面を撮る
- ストア用に仕上げる(背景や見出しを載せる)
- App Store Connect に登録する
このうち 2・3・4 は機械的な作業なので、自動化しやすそうです。問題は 1 で、ここが手作業の大半を占めていました。
逆にいえば、1さえ自動化できれば全体が一本に繋がるということになります。
やったこと
① 見せたい状態をコマンドで作る
ここで登場するのが xcrun simctl です。
Xcodeのコマンドラインツールに含まれている、iOSシミュレータを操作するためのCLIです。シミュレータの起動・終了といった基本操作のほか、アプリのデータ領域の場所を取得するといったこともできます。
これが今回の肝でした。
シミュレータ上のアプリは、Mac上のどこかのディレクトリに実データを持っています。その場所がコマンドで取得できるということは、アプリを一切操作せずに、外側からデータを用意できるということです。
やったことは、この領域に対して、
- 表示用のデータを直接書き込む
- アプリの表示言語を指定の言語に固定する
- チュートリアルなどの初回表示フラグを「表示済み」にしておく
といった内容を、言語ごとに流し込むスクリプトを1本用意しただけです。
これで「アプリを起動したら、その言語で、見せたい状態になっている」というところまでが自動になりました。
② 撮る
撮影自体も xcrun simctl のコマンド一発です。
あわせて、ステータスバーの表示を固定しておくのがおすすめです。時刻・電池残量・電波状況などをコマンドで固定できるので、撮影のたびに時刻がバラバラになる、といったことがなくなります。Appleの公式素材が9:41で揃っているのも有名な話ですね。
今回使ったのは、ざっくり以下のあたりでした。
| やりたいこと | 用意されているもの |
|---|---|
| 起動・終了 | アプリの起動/終了 |
| データ領域の取得 | アプリの保存先パスの取得 |
| スクリーンショット | 画面のPNG保存 |
| 表示の固定 | ステータスバーの上書き |
| 権限の付与 | マイクなどの許可を事前に付与 |
画面遷移だけは、結局シミュレータを操作する必要がありました。ここも含めて完全自動化できるとよかったのですが、今回はここまでとしています。
③ ストア用に仕上げる
撮ったままの素材は、当然ながらただのアプリ画面です。ストアに並べるには、背景を敷いてキャッチコピーを載せ、端末のフレームに収める必要があります。
ここは画像編集ツールで手作業でもできますが、言語ごとにコピーが変わるので、結局これも枚数ぶん発生します。
今回はレイアウトの位置やサイズを既存の掲載画像から測って、同じ構図をプログラムから再現する形にしました。見出しの文言だけを言語ごとに差し替えれば、あとは同じ処理を回すだけで揃います。
④ App Store Connect に登録する
ここで fastlane deliver の出番です。
App Store Connect には公式のAPIが用意されていて、掲載情報の取得・更新をプログラムから行えます。deliver はそれをラップしてくれるツールで、ローカルに置いたテキストファイルとスクリーンショットを、まとめて反映してくれます。
考え方はシンプルで、言語ごとのフォルダを作り、その中に項目ごとのテキストファイルを置きます。説明文なら説明文のファイル、キーワードならキーワードのファイル、といった具合です。スクリーンショットも同じように言語ごとのフォルダに入れておけば、一緒に上がります。
これにより、管理画面で言語を切り替えながら貼り付けていく作業がまるごと消えました。
さらに良かったのが、文言を1箇所にまとめて管理できるようになったことです。
今回は全言語の文言を1つのデータとして持ち、そこから deliver 用のファイル一式を生成する形にしました。こうしておくと、
- 文言を直したいときは元データだけ直せばよい
- 生成の段階で文字数制限を自動チェックできる
- 上限を超えていればその場でわかるので、貼り付けてから怒られることがない
というのが効きました。
なお、すべてが自動化できるわけではありません。 配信する国や地域の設定などは deliver の管轄外なので、そこは管理画面での操作が必要でした。とはいえ、一度決めれば頻繁に変えるものではないので、実用上は困っていません。
やってみて感じたこと
一番大きかったのは、作業量が減ったことよりも、やり直しのコストがかなり軽くなったことでした。
自動化する前は、UIを直すたびに「また全部撮り直しか」、コピーを変えるたびに「また7言語ぶん貼り直しか」という気持ちが先に来ていました。今は、直したらコマンドを流し直すだけで済みます。
結果として、掲載内容を最新に保つハードルが下がり、UIや文言の改善にも手を入れやすくなりました。 自動化の効果として、作業時間そのものより、こちらのほうが効いている実感があります。
また、手順がスクリプトとして残るので、「半年後の自分が同じことを再現できる」というのも地味に大きい利点だと感じました。個人開発だと、数ヶ月空くと当時の手順を完全に忘れてしまうので。。。
まとめ
多言語対応において、App Store Connect まわりの作業は想像以上に重いものでした。言語を1つ増やすたびに、素材も文言も掛け算で増えていきます。
ただ、xcrun simctl で素材づくりを、fastlane deliver で登録を、それぞれ自動化できたことで全体がかなり楽になりました。同じように多言語対応で作業量に困っている方がいれば、このあたりを検討してみるとよいかと思います。
なお今回、実際にはいくつか詰まった箇所もありました。認証まわりやスクリーンショットの登録あたりで手こずったのですが、書き始めると長くなってしまうので、機会があれば別の記事としてまとめたいと思います。
※本記事の内容は執筆時点のものです。ツールの仕様は変わる可能性がありますので、実際に導入される際は公式のドキュメントもあわせてご確認ください。
一読いただきありがとうございました。