やりたいこと
- 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でビルドを見た時に、いつビルドしたものなのかがぱっと見で判断できるというメリットもあったりする。
注意
AndroidではversionCode(=buildNumber)の最大値が2100000000までと決まっており、YYYYMMDDHHmm
は上限を超えてしまうため、この方法は採用できない。
https://developer.android.com/studio/publish/versioning?hl=ja
まとめ
ExpoのiOSアプリをApp Store Connectにアップロードする時には、app.config.tsでbuildNumberを日付と時間を使って動的に設定すればインクリメントし忘れがなくて楽。