◉RORK LABEN
●GPT-6.1 SOL — Rork のモデルメニューに追加(09-29)。Low/Medium/High を選べ、Pro・Max に含まれます●SONNET 5.5 — UI づくりが得意で、Sonnet 5 より出力が速いモデルが選べます(09-28)●SDK 58 — Beta が 09/15 から。stable の案内はまだなく、Expo Go でのプロジェクト実行は 09/03 からログインが必要です●WIDGET — iOS のウィジェットが本番ビルドだけ真っ黒になる原因を追った報告が出ています●OBSERVE — EAS Observe がネイティブクラッシュも記録します(SDK 57.0.21 以降・10/07)●NEW — 起動広告が、背面から戻った回にしか出ていませんでした。「前面に戻った」合図が、…●GPT-6.1 SOL — Rork のモデルメニューに追加(09-29)。Low/Medium/High を選べ、Pro・Max に含まれます●SONNET 5.5 — UI づくりが得意で、Sonnet 5 より出力が速いモデルが選べます(09-28)●SDK 58 — Beta が 09/15 から。stable の案内はまだなく、Expo Go でのプロジェクト実行は 09/03 からログインが必要です●WIDGET — iOS のウィジェットが本番ビルドだけ真っ黒になる原因を追った報告が出ています●OBSERVE — EAS Observe がネイティブクラッシュも記録します(SDK 57.0.21 以降・10/07)●NEW — 起動広告が、背面から戻った回にしか出ていませんでした。「前面に戻った」合図が、…
記事一覧/アプリ開発
◇ アプリ開発/2026-06-25上級

再インストールしたユーザーが「初回」に戻らない — Rork(Expo) アプリの初回判定と状態永続の非対称設計

Rork で生成した Expo アプリで、再インストール時に初回判定やオンボーディング・無料トライアルの状態が崩れる問題を、ストレージの永続性の非対称として整理し、設計で解く方法を共有します。Keychain と AsyncStorage の生存差、インストールと更新の軸の分離、サーバ権威の権利判定まで実装込みで解説します。

Rork585Expo219初回判定再インストールKeychain3AsyncStorage10状態永続トライアル

✦ プレミアム記事

再インストールしたユーザーが「初回」に戻らない

ある日、個人開発のアプリで「機種変更したらオンボーディングが出なかった」という問い合わせを受けました。普通は逆を心配します。再インストールでオンボーディングがまた出てしまうほうがよくある不満だからです。調べてみると、原因はストレージごとに「アンインストールで消えるか残るか」が違うことにありました。私が初回判定に使っていたフラグは、片方の端末では消え、もう片方では消えずに残っていたのです。

このとき腑に落ちたのは、再インストール周りの不具合はバグというより、ストレージの永続性の非対称を設計者が把握していないことから生まれるという点でした。その非対称を正面から扱い、初回判定・オンボーディング・無料トライアルを再インストールで崩さないための設計を、実装込みで共有します。

アンインストールで「消えるもの」と「残るもの」

まず事実を正確に押さえます。Expo/React Native アプリがアプリを削除したとき、何が消えて何が残るかはストレージと OS で異なります。とくに iOS の Keychain は、アプリを削除しても項目が残ることがある点が直感に反します。

保存先iOS でアンインストール後Android でアンインストール後
AsyncStorage / MMKV / ファイル消える消える
SecureStore (Keychain)残ることがある消える
SharedPreferences—自動バックアップで復元され得る
iCloud Keychain 同期項目端末をまたいで残る—
サーバ上のアカウント残る(端末非依存)残る(端末非依存)

この表が、再インストール周りの挙動のほぼすべてを説明します。AsyncStorage に初回フラグを置けば、再インストールでフラグが消えるのでオンボーディングがまた出ます。一方 SecureStore に「トライアル消化済み」を置けば、iOS では削除後も残るので再インストールしてもトライアルが戻りません(戻したい場合も戻したくない場合もあり、ここが設計判断です)。Android では SecureStore も消えますが、SharedPreferences は自動バックアップ設定次第で復元され得ます。

つまり「消えるか残るか」はストレージ選択で決まる仕様であって、偶然ではありません。設計の出発点は、各状態について『再インストールで消えてよいか/残ってほしいか』を先に決め、それに合うストレージに置くことです。

✦

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
✦アンインストールで「消えるストレージ」と「残るストレージ」の非対称を iOS / Android 別に整理し、初回判定が再インストールで壊れる理由を構造から示します
✦初回・更新・再インストールを取り違えないための永続インストール識別子の実装と、トライアルや権利をサーバ権威で判定する設計を、私が個人開発のアプリで使っている形のまま共有します
✦「初回起動(インストール軸)」と「更新後の What's New(バージョン軸)」を別軸として扱う実装と、Android の自動バックアップ落とし穴・移行チェックリストまで1本にまとめました
Stripe による安全な決済 · いつでもキャンセル可能
✦

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Rork Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • ✦コピー&ペーストで使える実装コード付き
  • ✦毎日新しい上級ガイドを追加
  • ✦¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

◇ アプリ開発2026-09-18
prebuild が requires the standard Expo SDK 57 Swift AppDelegate で止まったとき、まず確かめる3行
iOS 27 のために ios.enableSceneSupport を有効にすると prebuild が止まることがあります。原因は SDK の版ではなく AppDelegate.swift の形でした。確かめる3行と、手で書くときに SDK 58 の手順を真似てはいけない理由をまとめます。
◇ アプリ開発2026-09-16
消したはずのトークンが再起動で戻る — SecureStore の削除失敗を検知する設計
サインアウト直後に getItemAsync が null を返しても、Android のディスクには値が残っていることがあります。削除の成否を読み出しで確かめていた実装を、戻り値で判断する形へ書き直した記録です。
◇ アプリ開発2026-09-10
Rork のリポジトリに置く最初の EAS Workflow と、失敗した回にだけ届かない通知
Rork から書き出したリポジトリに .eas/workflows を二本置くまでの手順と、needs でつないだ通知が失敗した回にだけ届かなくなる理由を、手元で走る検査スクリプトの実行結果つきで書き残します。