expo release channel について
React Native でアプリを作る場合にExpoを利用することで、便利な機能を使うことができます。 その中でも、ストアでの審査・公開を挟まずにアプリのアップデートを配布できるOTAアップデートはとても便利です。
この記事ではOTAアップデートを行う際に設定できる「releas channel」についての情報をまとめます。
結論を先に書くと
- Expo を利用してビルドする際に「channel」を設定することで、OTAアップデートを制御できる。
- 同じ channel で新しい公開ビルドがあれば、OTAアップデートが行われる。
- 別名の channel でビルドを行えばOTAアップデートは行われない。
- 個人的には channel は「v2.0」の形で、メジャー・マイナーバージョンを設定している。パッチバージョンの更新のみOTAアップデートの対象にする方針。
release channel とは
https://docs.expo.io/distribution/release-channels/
リリースチャンネルを使うことでOTAアップデートにより更新を配布するか制御ができます。
ユーザーの端末のアプリに設定されている channel と同じ channel で新しいビルドが Expo にある場合、OTAアップデートが実行されます。 別名の channel であればOTAアップデートの対象にはなりません。
他にも Expo SDK のバージョンが異なる場合など、OTAアップデートの対象にならない条件があります。
テスト環境用ビルドを用意したい場合やOTAアップデートを行いたくない場合に、channel を利用して制御します。 そうしないと、思わぬ更新がユーザーの端末に配布されてしまう場合があります。不具合やまだ確認中の新機能や画面が公開されてしまっては困ります。
コマンド
Expo でビルドする際のコマンドを以下のようにします。
expo build:ios --release-channel <your-channel>
expo build:android --release-channel <your-channel>
特にチャンネルを指定しない場合は「default」チャンネルになっています。
前回のビルドも default チャンネルで行っている場合、OTAアップデートが有効になります。ビルドを行った時点でアップデートが配布されることになるので、意図しないアプリが配布されることにつながるので注意が必要です。
実機確認用にビルトしたい場合やリリース日をちゃんと制御したい場合であれば、チャンネルを指定してOTAアップデートが行われないように制御しましょう。
運用方針
基本的にOTAアップデートを制御できるよう、チャンネルを指定してビルドするのがおすすめです。
個人的な運用方針としては、メジャーバージョンとマイナーバージョンの数字で、channel 文字列を設定しています。 たとえば、2.1.4 のバージョンのアプリをビルドする時のチャンネルは以下の文字列を指定しています。
v2.1
こうすることで、パッチバージョンの更新はOTAアップデートで配布。 マイナー・メジャーバージョンの更新はOTAアップデートで配布せずにストアから審査・公開を経てアップデートする。
という形にしています。
パッチバージョンはストアでリリースしなくてもよいのですが、私はストアにも反映しています。 OTAアップデートは不具合に対する急ぎの対応や、日時を制御したいお知らせメッセージなどを審査なしで配布する目的で利用しているイメージです。
ビルドスクリプト
上記のルールで運用するにあたって、app.json の version の値を確認してコマンドを実行することになります。
毎回やるのは面倒ですしコマンドが長いので、npm script で実行できるようにしました。
"scripts": {
"version": "echo v$(expo config | grep '^ version:' | grep -oE '[0-9]+.[0-9]+')",
"build:ios": "expo build:ios --release-channel $(npm run version --silent)",
"build:android": "expo build:android --release-channel $(npm run version --silent)",
}
version
でapp.json の version の値を出力します。app.json から直接検索すればいいですが、せっかくなので expo-cli
の config コマンドを利用してます。
version の行を出力して、そのメジャー・マイナーバージョン部分の文字列のみを抽出しています。sed とか使ってもできそうですが npm script に書く時のエスケープが面倒だったので、単純な grep を重ねています。
build:ios
および build:android
で上記のバージョン出力スクリプトを利用して、チャンネルを指定したビルドコマンドを実行します。
--silent
は npm script 実行の際にログを無視して出力しないようにするオプションですね。これで version コマンドの出力のみを受け取っています。
おわりに
Expo を利用する最初のうちは channel を指定せず、基本 default チャンネルでビルドしていました。
ある日「4/1 から変更を反映したい!それまでは更新したくない!」という要件ができたとき、OTAアップデートが邪魔になりました。
調べた結果、channel を使うことでOTAアップデートを制御できたので、それを使って審査用アプリ提出や当日のアップデート配布をスムーズに行えました。
とても便利ですが、default のまま運用していると思わぬ時に事故を起こす可能性があります。なるべく channnel は意図的に設定するルールがいいですね。