React Native・Expo 難所

app.json
のバンドルIDを開発用と本番(TestFlight)用,で変えなきゃいけなかった
TestFlightで配信したアプリとexpo start
で開発用に起動するアプリのbundleIdentifierが同じ場合、QRコードを読み取った際に既にインストールされているTestFlight版が優先された。
TestFlightの方をアンインストールしてexpo startし直してQRコード読んでも、「使用可能なデータは見つかりません」のエラーになる。
だから、環境変数でバンドルIDを分けなきゃいけない。

Expo Notifications で通知を定期実行する際は、scheduleNotificationAsync
を使う。
scheduleNotificationAsync
で
トリガーのtypeにTIME_INTERVAL
、repeats: true
(リピート)にする場合、1分空けないといけない。

async-storageを使うとエラーになる。
(NOBRIDGE) ERROR Warning: Error: [@RNC/AsyncStorage]: NativeModule: AsyncStorage is null.
キャッシュクリアしてみたが、だめ。
issueも上がっている。
React Nativev0.76.3
だと動作するかも??→動作しなかった
Dev Client を有効にして、ビルドし直したら動作した

ネイティブ機能の要する以下のようなライブラリを使って開発するときは、1度だけexpo build
する必要がある。
(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)をセットアップして運用。
- ネイティブ依存が変わるたびにローカルで再ビルドが必要。

ストアのスクリーンショット用にアプリのスクリーンショットを撮ろうと、
エミュレーターでヘルスケアのデータを読み込みうとした。
はじめは自分のicloudにログインしたがヘルスケアのデータは読めずに失敗。
次にサンプル用で公開されているらしいデータがあったのですが、
公式の手順の画面にならず、断念
ストアのスクリーンショットは、figmaで作成することにした。
フリーで公開されているものが散見されるので、それを使用。ありがとうございます🙇♂️

Expoでエミュレーター上でdev clientを使うために
eas.json
に以下を追加する必要あり。
"build": {
"development": {
"developmentClient": true,
"distribution": "internal",
"env": {
"APP_VARIANT": "development"
},
"ios": {
"simulator": true // 追加
}
},

「画像にアルファチャンネルや透過を含めることはできません」エラー
Macのプレビューアプリから、ファイル→書き出す→アルファのチェックを外す→pngで書き出す
してその画像を使用するとうまくいく

プライバシーポリシーのページを用意しないといけない

ここで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
}
}
}
}

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

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環境が立ち上がるようになる。
ビルドしたアプリをインストールのと、インストールしたアプリを起動するのは別で考えたほうがいい。

initialRouteName が効かない。
初回起動ならオンボーディングページを表示、2回目以降起動ならオンボーディングページを出さずホーム画面に飛ばすようにしたかった。
Redirect で対応する事例があげられているので、私もそちらで対応。

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だけで、本番ストア配信まではしていなかったが、これからはしないと、、、
無駄なビルド叩いてしまう。
自動でバージョンをインクリメントする仕組みもありそう。