やりたいこと

  • Expoを利用したReact NativeアプリでiOSアプリをApp Store Connectにアップロードする時、アップロードのたびにapp.jsonの中のbuildNumberをインクリメントする必要がある。
  • しかし、buildNumberを手動で更新するのは忘れがち。忘れたままeas buildすると、buildで時間がかかった後にエラーで失敗するので、非常にもどかしい。ゆで卵がうまく剥けなかった時くらいもどかしい。
  • そこで、buildNumberを動的に設定することでbuildNumberを手動で更新しなく済むようにしたい。

app.config.tsで動的にbuildNumberを設定する

やり方は簡単。 app.jsonはapp.config.tsから動的に設定することができる。(jsで書いてる場合はapp.config.js)

よく環境に合わせてAPIのbaseUrlをここで動的に設定したりする。

それと同じ要領で次のようにapp.config.tsに書き込むことで、buildNumberも動的に設定することができる。

app.config.ts

import { ExpoConfig, ConfigContext } from '@expo/config';
import dayjs from "dayjs";
import ja from "dayjs/locale/ja";
dayjs.locale(ja);

export default ({ config }: ConfigContext): ExpoConfig => {
    return {
        ...config,
        ios: {
            ...config.ios,
            // ↓ここで設定している
            buildNumber: dayjs().format("YYYYMMDDHHmm") 
        },
    }
};


buildNumberは以前の値と同じ値は使えず、かつ以前の値よりも大きい値である必要がある。 今回は日付と時間を文字列に変換することで、それを解決している。(時間は前にしか進まないので、日付と時間を使えば必ず前回より大きな値を設定することができる) eas buildを連続で行うことは(おそらく)ないので、「年月日時分」まででフォーマットしている。(毎秒eas buildしたい人は秒まで含めてください笑)

副産物的として、App Store Connectでビルドを見た時に、いつビルドしたものなのかがぱっと見で判断できるというメリットもあったりする。

スクリーンショット 2022-06-21 11.56.47.png

注意

AndroidではversionCode(=buildNumber)の最大値が2100000000までと決まっており、YYYYMMDDHHmmは上限を超えてしまうため、この方法は採用できない。

https://developer.android.com/studio/publish/versioning?hl=ja

まとめ

ExpoのiOSアプリをApp Store Connectにアップロードする時には、app.config.tsでbuildNumberを日付と時間を使って動的に設定すればインクリメントし忘れがなくて楽。