◉RORK LABEN
●EXPO — EAS Observe がネイティブクラッシュも記録(10/07)。SDK 57 は 57.0.21 以降で確認できます●RORK — 09-29 に GPT-6.1 Sol、09-28 に Claude Sonnet 5.5 を追加。モデル選択で使えます●RN 0.88 — React Native 0.88.x の正式リリース予定は 10/12、残り2日●Q&A — AuthSession が Android の standalone で結果を返さない、という問いが長く続いています●WINDOWS — Mac がなくても Windows だけで iPhone アプリを出す手順が共有されています●NEW — Expo Go で通知だけが届かない夜に、先に切り分ける3点●EXPO — EAS Observe がネイティブクラッシュも記録(10/07)。SDK 57 は 57.0.21 以降で確認できます●RORK — 09-29 に GPT-6.1 Sol、09-28 に Claude Sonnet 5.5 を追加。モデル選択で使えます●RN 0.88 — React Native 0.88.x の正式リリース予定は 10/12、残り2日●Q&A — AuthSession が Android の standalone で結果を返さない、という問いが長く続いています●WINDOWS — Mac がなくても Windows だけで iPhone アプリを出す手順が共有されています●NEW — Expo Go で通知だけが届かない夜に、先に切り分ける3点
記事一覧/アプリ開発
◇ アプリ開発/2026-09-29中級

起動のたびに一瞬ログイン画面が出る expo-router アプリを、Protected routes と「まだ分からない」の三状態で組み直す

ログイン済みなのに起動直後にログイン画面が一瞬出る、ログアウトしても画面が変わらない。expo-router の Protected routes に Supabase の認証状態を「不明」込みの三つで渡し、_layout.tsx の置き場所まで含めて直した手順です。

expo-router3Supabase35認証15Protected routesRork577

✦ プレミアム記事

Rork で組んだ試作アプリに Supabase のログインを繋いだ晩、手元の iPhone で起動を何度も繰り返しておりました。ログインは済んでいるはずなのに、起動のたびにログイン画面がほんの一瞬だけ見えて、そのあとホームに切り替わるのです。

最初は気のせいだと思いました。ところが画面を録画して 1 コマずつ送ると、確かにログイン画面が描かれてから消えていました。ログアウトを押しても画面が変わらず、アプリを閉じて開き直すとようやくログイン画面になる、という別の症状も一緒に出ていたのです。

同じ症状は expo/expo の Issue #37305 に集まっています。2025 年 6 月に立ったまま開いていて、コメントは 26 件——黒い画面のまま止まる方、ログアウト後に画面が更新されない方、ドキュメントどおりに写したのに動かないと書く方が並んでおります。

最初にお伝えしたいのは、Protected routes そのものは壊れていない、という一点です。壊れていたのは私の側で、ログインしているかどうかを「はい」と「いいえ」の二つだけで持っていたことが原因でした。そう気づいたのは、録画を 1 コマずつ送り終えたあとでした。現実には三つ目の「まだ分からない」があり、起動直後はほぼ必ずそこにいるのです。

二値の guard に、三値の現実を押し込んでいました

Stack.Protected の guard は真偽値を受け取ります。ログイン済みなら true、そうでなければ false——それ自体は正しい設計です。

問題は、起動直後の「セッションをまだ読めていない」状態を、私が false に丸めていたことでした。session が null のあいだは未ログイン扱いになり、ログイン画面が描かれます。数百ミリ秒後にセッションが読み終わると guard が反転し、ホームへ切り替わるのです。

実際の状態二値のときの guard描かれる画面三値にしたときの扱い
まだ読めていないfalse(null を丸める)ログイン画面が一瞬どちらも描かない
未ログインfalseログイン画面ログイン画面
ログイン済みtrueホームホーム

壁紙アプリで、広告非表示を購入済みの検証端末に起動直後だけ広告が一度出る件を直したときと、まったく同じ構図でした。購入状態を読み終える前に「未購入」として扱っていたのが原因で、「まだ分からない」を作った瞬間に消えたのです。個人開発で何度も踏んできた穴なのに、認証でもう一度踏みました。Issue の長さを見るかぎり、私だけの癖ではないのかもしれません。

判定できないあいだは、どちらの画面も出しません。 今回の修正は、この一文に尽きます。

用意するもの

部品条件備考
Rork で生成した Expo プロジェクトexpo-router 5 以降(SDK 53 以降)Protected routes は SDK 53 で入りました
@supabase/supabase-js2 系Rork の「Connect Supabase」で入る版で十分です
expo-splash-screen同梱「不明」のあいだスプラッシュを保つために使います
実機か Expo GoiOS・Android どちらか 1 台録画できる端末だと確認が楽です

Rork の「Connect Supabase」で繋いだプロジェクトには、lib/supabase.ts のようなクライアントが既にあります。ストレージアダプタも含めてそのまま使い、認証状態の持ち方だけを差し替えます。

✦

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

この記事の続きを読む

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

この記事で得られること
✦起動直後にログイン画面が一瞬出る原因を、自分の _layout.tsx が guard に渡している値から特定できるようになります
✦認証状態を「不明・未ログイン・ログイン済み」の三つで持つ AuthProvider を、Supabase と expo-router で今日から動く形で手元に持てます
✦Issue に 26 件のコメントが並ぶ黒画面と「ログアウトしても画面が変わらない」を、グループごとの _layout.tsx とガードの平坦化で先回りして防げるようになります
Stripe による安全な決済 · いつでもキャンセル可能
✦

この記事を購入する

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

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

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

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

  • ✦コピー&ペーストで使える実装コード付き
  • ✦毎日新しい上級ガイドを追加
  • ✦¥580/月 または ¥2,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 でつないだ通知が失敗した回にだけ届かなくなる理由を、手元で走る検査スクリプトの実行結果つきで書き残します。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます