RORK LABEN
BUILD — Rork Max はクラウド上の実機 Mac に Xcode と iOS SDK を載せ、SwiftUI を書き、ビルドし、エラーを読んで直す反復を回します。コードを吐いて終わりではない点が生成物の質に効いていますNATIVE — 生成されるのは React Native ではなく純粋な Swift / SwiftUI です。AR や Metal、ウィジェットなど React Native からは届かない機能に手が届くことが、他ビルダーとの実質的な差になりますPLATFORMS — 対応は iPhone・iPad・Apple Watch・Apple TV・Vision Pro に加えて iMessage まで含みます。ウォッチや拡張から入る設計を試すのに向いていますCOMPANION — Rork Companion により、有料の Apple Developer アカウントなしで生成したアプリを実機の iPhone で確認できます。最初の一本を試す段階の障壁が一段下がりましたPRICING — 無料で開始でき有料プランは月額25ドルから、Rork Max は月額200ドルの Max プランです。回収できる本数と規模を先に見積もっておく価値がありますDEADLINE — Google Play は2026年8月31日以降、新規アプリと更新の双方に対象 API レベル36 以上を要求します。残り10日で、生成物の targetSdkVersion は自分で確認が必要ですBUILD — Rork Max はクラウド上の実機 Mac に Xcode と iOS SDK を載せ、SwiftUI を書き、ビルドし、エラーを読んで直す反復を回します。コードを吐いて終わりではない点が生成物の質に効いていますNATIVE — 生成されるのは React Native ではなく純粋な Swift / SwiftUI です。AR や Metal、ウィジェットなど React Native からは届かない機能に手が届くことが、他ビルダーとの実質的な差になりますPLATFORMS — 対応は iPhone・iPad・Apple Watch・Apple TV・Vision Pro に加えて iMessage まで含みます。ウォッチや拡張から入る設計を試すのに向いていますCOMPANION — Rork Companion により、有料の Apple Developer アカウントなしで生成したアプリを実機の iPhone で確認できます。最初の一本を試す段階の障壁が一段下がりましたPRICING — 無料で開始でき有料プランは月額25ドルから、Rork Max は月額200ドルの Max プランです。回収できる本数と規模を先に見積もっておく価値がありますDEADLINE — Google Play は2026年8月31日以降、新規アプリと更新の双方に対象 API レベル36 以上を要求します。残り10日で、生成物の targetSdkVersion は自分で確認が必要です
記事一覧/アプリ開発
アプリ開発/2026-06-25上級

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

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

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

プレミアム記事

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

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

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

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

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

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

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

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

まず「どう振る舞ってほしいか」を決める

状態ごとに望ましい挙動は違います。私はこのアプリ群を運用する中で、状態を足すたびに次の3問を自分に投げます。

  1. この状態は再インストールでリセットされるべきか(例: ローカルの下書き、UI設定)
  2. この状態は再インストールでも残るべきか(例: 不正なトライアル再取得を防ぐ識別子)
  3. この状態は端末ではなくサーバが持つべきか(例: 購入・サブスク・アカウント)

下表は私の既定の割り当てです。

状態望ましい挙動置き場所
オンボーディング完了再インストールで再表示してよいAsyncStorage
UI 設定・テーマ消えてよいAsyncStorage
無料トライアル消化残ってほしい(再取得防止)サーバ(補助に SecureStore)
購入・サブスク権利端末非依存で残るサーバ / ストア(StoreKit/Play)
インストール識別子同一端末では残ってほしいSecureStore

要点は、お金と不正に関わる状態を端末ストレージだけで判定しないことです。AsyncStorage は再インストールで消えるので、ここに「トライアル済み」を置くと、削除→再インストールでトライアルが無限に取り直せます。逆に SecureStore だけに頼ると、iOS と Android で挙動が割れます。お金が絡む判定は最終的にサーバが持つべきで、端末ストレージは速度のためのキャッシュに留めます。

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

この記事の続きを読む

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

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

この記事を購入する

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

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

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

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

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

関連記事

アプリ開発2026-08-18
Rork のプロジェクトで targetSdkVersion 36 を通すまでに直した3か所
app.json に targetSdkVersion 36 と書いてあるのに、ビルドが読んでいた値は 35 でした。実効値を報告するスクリプトと、引き上げ・更新停止・延長申請の三択の分け方を残します。
アプリ開発2026-08-16
グラフが壊れて見えるのは、データが多いときではなく最初の数日でした
記録アプリの折れ線グラフが、データの少ない最初の数日だけ線が消える。原因はY軸の幅が0になり座標がNaNになることでした。実測した挙動と、描画前に置く小さな正規化層を紹介します。
アプリ開発2026-08-06
壁紙の上の文字が読めるかを、端末ではなく取り込み時に決める — 判定指標を4つ測り比べた記録
壁紙の上に置くステータスバーや見出しが読めるかを、端末での画像解析ではなく取り込み時のメタデータで決める設計です。240枚のコーパスで判定指標を4つ実測し、縮小画像での判定が何と一致するのかまで記録しました。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →