SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

ExpoとEASで始める快適モバイルアプリ開発

ExpoとEASで属人的なリリース作業を脱却する。バージョン管理やEAS Metadataによるストア情報管理まで

ExpoとEASで始める快適モバイルアプリ開発 第12回

EAS Metadataでストア情報を管理する

 EAS Metadataは現在ベータ段階の機能として提供されており、コマンドを実行すると「EAS Metadata is in beta and subject to breaking changes.」という警告が表示されます。対応するストアはApple App Storeのみです。Google Playは対象外なので、ここではiOSアプリのストア情報を管理する方法に絞ります。

 App Storeの説明文やキーワード、カテゴリをWebフォームで一つずつ編集する作業は、項目が少ないうちは苦にならないかもしれません。しかし、リリースのたびに日本語や英語など複数ロケールの情報を更新し、入力漏れがないか画面を行き来して確認するのは手間がかかります。

 EAS Metadataを使うと、こうしたストア情報をプロジェクト内のstore.config.jsonで管理できます。

 まずはApp Store Connectに登録済みの情報をローカルへ取得して、現在の状態をファイルにします(リスト6)。Webフォームへ入力済みの内容を手で転記する必要がないため、EAS Metadataを導入する最初の一歩としても手軽です。

[リスト6]ストア情報をローカルに取得
eas metadata:pull

 pullを実行すると、プロジェクト直下にstore.config.jsonが生成されます。作成して間もないアプリでは、次の内容になります(リスト7)。誌面の都合でdvisoryの項目は3つに省略していますが、実際には20以上の項目が並びます。

[リスト7]pull直後の store.config.json(抜粋)
{
  "configVersion": 0,
  "apple": {
    "version": "1.0",
    "release": {
      "automaticRelease": true
    },
    "info": {
      "ja": {
        "title": "EASのサンプル"
      }
    },
    "advisory": {
      "alcoholTobaccoOrDrugUseOrReferences": "NONE",
      "gambling": false,
      "violenceCartoonOrFantasy": "NONE"
    }
  }
}

 初期状態に入っているのは、アプリのバージョン、リリース方法(automaticRelease: trueは審査通過後に自動で公開する設定)、ロケール別の表示情報info(この時点ではアプリ名のみ)、年齢レーティングの回答advisoryです。

 なおapp.jsonには1.0.0と書いてありますが、App Store Connect側では1.0として保持されています。ストアの入力フォームで見てきた項目たちが、そのままJSONの形で手元に来たことがわかります。

 ここへ、ストアに表示したい情報を書き足していきます。infoのロケール別オブジェクトにはsubtitledescriptionkeywordsなどを追加でき、別の言語を足したいときは同じ階層にロケールのキーを並べます(リスト8)。

[リスト8]info を多言語で書き足す(抜粋)
"info": {
  "ja": {
    "title": "EASのサンプル",
    "subtitle": "Expoで作ったサンプルアプリ",
    "description": "ExpoとEASの連載で使用するサンプルアプリです。",
    "keywords": ["Expo", "EAS", "React Native"]
  },
  "en-US": {
    "title": "EAS Sample",
    "subtitle": "A sample app built with Expo",
    "description": "This is the sample app used in the Expo and EAS series.",
    "keywords": ["Expo", "EAS", "React Native"]
  }
}

 言語を増やす作業が、オブジェクトを一つ並べるだけになりました。ロケールごとに画面を開き直して入力し、どちらかを直し忘れていないか見比べる、という往復がなくなります。日本語版だけ説明文を更新して英語版が古いまま、といった事故も、ファイルの差分を見れば気づけます。

 ストアに載るのは説明文だけではありません。アプリのカテゴリや、審査担当者に伝える連絡先もstore.config.jsonで管理できます。いずれもappleの下にinfoと並べて書きます(リスト9)。

[リスト9]カテゴリ・審査情報・リリース方法を指定する(抜粋)
"categories": ["DEVELOPER_TOOLS", "UTILITIES"],
"review": {
  "firstName": "Yukiya",
  "lastName": "Nakagawa",
  "email": "review@example.com",
  "phone": "+81 90 0000 0000",
  "demoRequired": false,
  "notes": "This is a sample app for a magazine series. No sign-in is required."
},
"release": {
  "automaticRelease": true,
  "phasedRelease": true
}

 reviewは審査担当者向けの情報です。ログインが必要なアプリならdemoRequiredtrueにしてdemoUsernamedemoPasswordを添えられます。「審査に出すとき、どのアカウントを渡したんだったか」を毎回思い出す作業が、リポジトリを見れば済むようになります。連絡先は例として書いていますので、実際には自分の届く先を指定してください。

 releaseautomaticReleaseは前述のとおり審査通過後に自動で公開する設定です。ここにphasedReleaseを加えると、アップデートを7日間かけて段階的に配信するよう指定できます。一度に全員へ届けず、様子を見ながら広げていく考え方は、次回扱うEAS Updateにも別の形で出てきます。

 ただし、infoで扱えるのはタイトルや説明文といったテキストの項目に限られます。ストアの見栄えを左右するスクリーンショットやプレビュー動画はstore.config.jsonの対象外で、App Store Connectでの作業として残ります。ストア情報のすべてがコードになるわけではない、という線引きは押さえておきましょう。

 ファイルを編集したら、いきなりストアへ反映するのではなく、まずeas metadata:lintで検証します。実際、リスト8の状態でlintを実行したところ、筆者の環境では2件のエラーが検出されました。「The value at /apple/info/ja is missing the required field 'privacyPolicyUrl'.」と、en-USについての同じ内容のエラーです。プライバシーポリシーのURLは、公開直前になって不足に気づきがちな必須項目の代表でしょう。ロケールを増やせば必須項目もその分だけ増えますが、lintは足りていないロケールをすべて挙げてくれます。infoの各ロケールにprivacyPolicyUrlを書き足せば、lintが通るようになります。

 このように、文字数超過や必須項目の欠落といった審査リジェクトにつながる定番のミスを、ストアに反映する前に手元で検出できるのが、Webフォームへ直接入力する場合にはない大きな利点です。検証を通したあとでeas metadata:pushを実行し、App Store Connectへ反映します(リスト10)。

[リスト10]検証してからストアに反映
eas metadata:lint
eas metadata:push

 新規アプリの場合は、先にバイナリをeas submitでApp Store Connectへ提出しておく必要があります。前回の記事でiOSバイナリを提出し、App Store Connect側で処理が済んでいる本連載の流れでは、この条件を満たしています。以降はストア情報を編集するたびに、lintで確認してからpushする手順を繰り返せばよいでしょう。

 eas metadata:pushの出力には、更新した項目と、未設定のためスキップした項目が一覧で報告されるので、何が反映されたのかをその場で確認できます。pushが完了すると、App Store Connectのアプリ情報やバージョン情報に、ローカルで編集した説明文やキーワードが反映されます(図2)。

図2:eas metadata:push で反映されたストア情報
図2:eas metadata:push で反映されたストア情報

 EAS Metadataがまだベータ段階で、Apple App Storeに限られる点には注意が必要ですが、対応範囲ではストア情報をコードとして扱えます。ストア情報がコードになれば、変更内容をレビューでき、Gitのdiffで更新箇所も追跡できます。ストアにおけるInfrastructure as Codeとして、リリース作業をチームで再現しやすくする仕組みです。

まとめ

 今回は、前回コマンド化した提出まわりに残っていた手作業を、ひとつずつ削ってきました。

 --auto-submitは、ビルドの完了を見張る時間をなくしました。ビルドが成功すればそのまま提出へ進むので、コマンドを打ったあとは席を外せます。バージョン番号はappVersionSource: "remote"によってEAS側の共有カウンタへ移り、「次のビルド番号はいくつだったか」を誰かに尋ねる必要がなくなりました。そしてEAS Metadataは、ストアの説明文やキーワード、審査担当者へ渡す情報をstore.config.jsonに集めました。ベータ段階でApple App Storeに限られ、スクリーンショットは扱えないという制約はありますが、対応する範囲ではストア情報をレビューでき、Gitの差分で変更を追跡できます。

 ここまで、第10回を「ビルドの民主化」、第11回を「リリース作業の民主化」と呼んできました。今回のテーマはリリース作業から属人性を抜くことです。次のビルド番号、審査担当者へ渡したデモアカウント、去年書いた説明文……これまで担当者の記憶やどこかのスプレッドシートに置かれていた情報が、リポジトリの中のファイルになりました。担当が替わっても同じ手順を再現できます。

 もっとも、手元に残っているものもあります。提出に使う.p8ファイルやサービスアカウントのJSONは、第11回で.gitignoreに追加したとおり、各自のマシンに置いたままです。自分の手で提出する分には困りませんが、CIサーバーに提出を任せようとすると、この鍵をどう渡すかが壁になります。第9回で署名クレデンシャルをeas credentialsに預けたのと同じ発想が提出にも及ぶのですが、その話は第14回で扱います。

 次回(第13回)はEAS Updateです。ストアに出したアプリを、審査を待たずに直せる仕組みを紹介します。鍵になるのはeas fingerprintで、「ネイティブビルドが必要な変更か、JavaScriptの更新だけで届けられる変更か」を判断してくれます。ストアへ届けたその先の世界へ進みましょう。

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
ExpoとEASで始める快適モバイルアプリ開発連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト 中川 幸哉(ナカガワ ユキヤ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/29683 2026/09/18 09:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー