Open13

React Native・Expo 難所

Hayato YokoyamaHayato Yokoyama

app.jsonのバンドルIDを開発用と本番(TestFlight)用,で変えなきゃいけなかった

TestFlightで配信したアプリとexpo startで開発用に起動するアプリのbundleIdentifierが同じ場合、QRコードを読み取った際に既にインストールされているTestFlight版が優先された。

TestFlightの方をアンインストールしてexpo startし直してQRコード読んでも、「使用可能なデータは見つかりません」のエラーになる。

だから、環境変数でバンドルIDを分けなきゃいけない。

https://docs.expo.dev/guides/environment-variables/
https://zenn.dev/kiiita/articles/9ee2c21cb9fd95

Hayato YokoyamaHayato Yokoyama

Expo Notifications で通知を定期実行する際は、scheduleNotificationAsyncを使う。

scheduleNotificationAsync
トリガーのtypeにTIME_INTERVALrepeats: true(リピート)にする場合、1分空けないといけない。

https://qiita.com/sei_sato/items/cb0bdb35a3eedc142219#:~:text=※ 繰り返し通知する場合は、少なくとも1分以上の間隔をあける必要があります。

公式ドキュメント見つけたい。。。
→あった
https://docs.expo.dev/versions/latest/sdk/notifications/?utm_source=chatgpt.com#:~:text=On iOS%2C when repeats is true%2C the time interval must be 60 seconds or greater. Otherwise%2C the notification won't be triggered.

Hayato YokoyamaHayato Yokoyama

async-storageを使うとエラーになる。
https://react-native-async-storage.github.io/async-storage/docs/usage/
https://react-native-async-storage.github.io/async-storage/

 (NOBRIDGE) ERROR  Warning: Error: [@RNC/AsyncStorage]: NativeModule: AsyncStorage is null.

キャッシュクリアしてみたが、だめ。
https://docs.expo.dev/troubleshooting/clear-cache-macos-linux/

issueも上がっている。
https://github.com/react-native-async-storage/async-storage/issues/1165

React Nativev0.76.3だと動作するかも??→動作しなかった

Dev Client を有効にして、ビルドし直したら動作した

Hayato YokoyamaHayato Yokoyama

ネイティブ機能の要する以下のようなライブラリを使って開発するときは、1度だけexpo buildする必要がある。

https://wuba.github.io/react-native-echarts/
https://commerce.nearform.com/open-source/victory-native

 (NOBRIDGE) ERROR  Invariant Violation: TurboModuleRegistry.getEnforcing(...): 'RNSkiaModule' could not be found. Verify that a module by this name is registered in the native binary. [Component Stack]

前提としてExpoにはManaged WorkflowとBare Workflowがある。

Managed Workflow

  • 特徴: ネイティブコードはすべて Expo によって管理され、開発者は基本的にJavaScript/TypeScript のみを扱う
  • ネイティブライブラリを使う場合:
    • デフォルトの Expo Go アプリではカスタムネイティブモジュールが動作しない。
    • カスタムクライアント(expo-dev-client を使ったアプリ)を一度 expo build で作成する必要があり。
    • その後はホットリロードで開発可能。再ビルドはネイティブ依存が変わらない限り不要。

Bare Workflow

  • 特徴: ネイティブコードを直接編集できるフルコントロールの開発環境。
  • ネイティブライブラリを使う場合:
    • expo build を使わず、自分でビルド環境(Xcode, Android Studio)をセットアップして運用。
    • ネイティブ依存が変わるたびにローカルで再ビルドが必要。

https://zenn.dev/hal1986/articles/20220616-bare-to-managed#expo-dev-client-とは

Hayato YokoyamaHayato Yokoyama

ストアのスクリーンショット用にアプリのスクリーンショットを撮ろうと、
エミュレーターでヘルスケアのデータを読み込みうとした。

はじめは自分のicloudにログインしたがヘルスケアのデータは読めずに失敗。

次にサンプル用で公開されているらしいデータがあったのですが、
公式の手順の画面にならず、断念

https://developer.apple.com/documentation/healthkit/samples/accessing_sample_data_in_the_simulator

ストアのスクリーンショットは、figmaで作成することにした。

https://www.figma.com/community/file/1057267104690766331/appstore-screenshot-template

フリーで公開されているものが散見されるので、それを使用。ありがとうございます🙇‍♂️

Hayato YokoyamaHayato Yokoyama

Expoでエミュレーター上でdev clientを使うために
eas.jsonに以下を追加する必要あり。

	"build": {
		"development": {
			"developmentClient": true,
			"distribution": "internal",
			"env": {
				"APP_VARIANT": "development"
			},
			"ios": {
				"simulator": true // 追加
			}
		},
Hayato YokoyamaHayato Yokoyama

ここでdevelopment環境とproduction環境でバンドルIDを分けたが、expo startでTestflightが立ち上がってしまう問題が発生。

バンドルIDを分けられていないのか...。
app.jsonの方にもbundleIdentifierの設定の残っているので、それが悪さしているかも

Simulatorビルドにしたのが悪さしていた。
"simulator": trueにすると、シミュレーター用のビルドになるっぽい。
Expoのビルドのタイトルが「iOS internal distribution build」から「iOS simulator build」になっていた。

"ios": {
        "simulator": true
      }

シミュレーターも使いつつ、実機のExpo goアプリでも動作させるなら、"ios-simulator"のような新しいシミュレーター用のプロファイルを作る必要がありそう。

{
  "build": {
    "development": {
      ... 
    },
    "ios-simulator": {
      "extends": "development",
      "ios": {
        "simulator": true
      }
    }
  }
}

https://docs.expo.dev/tutorial/eas/ios-development-build-for-simulators/

Hayato YokoyamaHayato Yokoyama

ExpoGoで動かす開発用アプリと、Storeで配信される本番用アプリのアイコン変えたい。
環境変数で切り分けられる気がするので、やってみる。

Hayato YokoyamaHayato Yokoyama

development用(Expo Go)と、Production用(Testflight)のどちらもインストールされているときに、
development用をアンインストールして、APP_VARIANT=development npx expo start のQRコードを読み取ると、Production側が立ち上がってしまう。Production側も消すと、「使用可能なデータは見つかりません」のエラーになる。

APP_VARIANT=development npx expo start は常にdevelopment用があるかどうかだけを見てほしい。

→ WebのExpoのOverviewやBuildsから過去に行ったDevelopmentビルドを選択し、そこからinstallボタンをクリックすると、QRコードが表示される。それを読み取ると「iTunesで開く」と表示されるのでクリックして、インストール。

そうすると、APP_VARIANT=development npx expo start でdevelopment環境が立ち上がるようになる。

ビルドしたアプリをインストールのと、インストールしたアプリを起動するのは別で考えたほうがいい。

Hayato YokoyamaHayato Yokoyama

initialRouteName が効かない。
初回起動ならオンボーディングページを表示、2回目以降起動ならオンボーディングページを出さずホーム画面に飛ばすようにしたかった。

https://github.com/expo/router/issues/428

Redirect で対応する事例があげられているので、私もそちらで対応。

Hayato YokoyamaHayato Yokoyama
You've already submitted this version of the app.
Versions are identified by CFBundleShortVersionString from Info.plist (expo.version in app.json).
If you're submitting an Expo project built with EAS Build, increment the version (expo.version) in app.json and build the project again.

ストア配信したあとに、また同じバージョンでsubmitしたらエラーになった。
今まで、testfilghtだけで、本番ストア配信まではしていなかったが、これからはしないと、、、
無駄なビルド叩いてしまう。

自動でバージョンをインクリメントする仕組みもありそう。