前提
- React Native 0.61.4
- Expo 3.17.11
背景
RN開発をしていると、プルリクで複数デバイスでの見栄えのキャプチャを添付することがよくある。
Vanilla React Nativeであれば、複数のシミュレータを
react-native run ios --simulator simulator-name
から起動すればよい。
しかし、ExpoはExpoのクライアントアプリが必要かつ、expoコマンドで起動するので、
シミュレータを指定する方法が不明だったので、調べる必要があった。
基本的にはこちらの参考記事にしたがって進めればいいのだが、手元ではExpoがインストールされない問題にぶち当たったので、その解決方法を記す。
方法
結論
上記参考記事を要約すると、xcrunコマンドを駆使してforループでシミュレータ起動&Expoインストールをすればよいということだ。
そして、僕が手元でうまくいかなかったExpoのインストールは、初回のみ対象のシミュレータを個別で expo start
で起動してインストールする。
(Expoは自動で最後に開いていたシミュレータを起動する)
以下はその具体的な手順。
記事の方法
念のため、まずは参考記事の方法から。
(繰り返しだが、これでうまく行けばいいが、手元ではうまくいかなかった)
- iOS simulatorのIDを取得する
xcrun simctl list
- 一覧から、目的のシミュレータのIDを変数
simulators
に格納
declare -a simulators=("YOUR-SIMULATOR-ID1" "YOUR-SIMULATOR-ID2" "YOUR-SIMULATOR-ID3")
- Expoのバージョン確認
expo --version
- installするExpoのバージョンを前述のバージョンに変更し、以下のコードを実行する
for i in "${simulators[@]}"
do
xcrun instruments -w $i
xcrun simctl install $i ~/.expo/ios-simulator-app-cache/Exponent-3.17.11.app # バージョンによって"3.17.11"の部分を変更する
xcrun simctl openurl $i exp://127.0.0.1:19000
done
だが、何度やってもシミュレータが立ち上がるまでで、Expoがインストールされない。
Expoをシミュレータに個別でインストールする
様子を個別にみるため、forループを外してやってみたところ、以下のエラーが起きていた。
xcrun simctl openurl YOUR-SIMULATOR-ID exp://127.0.0.1:19000
An error was encountered processing the command (domain=NSOSStatusErrorDomain, code=-10814):
The operation couldn’t be completed. (OSStatus error -10814.)
要するにインストールできませんでしたよと。
色々調べていたが、途中で面倒になったので、Expoの自動インストールに任せることにした。
Expoは最後に起動したシミュレータを起動するようなので、対象のシミュレータを一度起動し、最後に閉じる。
方法は何でもいいが、
例えば、以下の記事や、
https://stackoverflow.com/questions/47709953/expo-change-default-ios-simulator
あるいは、以下のコマンドでも出来る
xcrun instruments -w YOUR-SIMULATOR-ID #シミュレータの起動
Expoが未インストールのシミュレータを最後に閉じるのを確認した上で、もう一度、
expo start
これでExpoが入って、アプリが立ち上がるはず。
一度Expoを入れてしまえば、今後は以下のコマンドで3つとも立ち上がる。
declare -a simulators=("YOUR-SIMULATOR-ID1" "YOUR-SIMULATOR-ID2" "YOUR-SIMULATOR-ID3")
for i in "${simulators[@]}"
do
xcrun instruments -w $i
xcrun simctl openurl $i exp://127.0.0.1:19000
done
編集後記
もっとスマートな方法があるはずだが、30分ほどエラーと戦って面倒くさくなってやめました。
もし見つけた方は教えてくださると幸いです。