RORK LABEN
NATIVE — Rork Max では AR / LiDAR スキャン、Metal を使った 3D、Dynamic Island、Siri Intents、HealthKit、NFC、App Clips、Core ML まで届きますIOS27 — iOS 27 Developer Beta 4 で Siri AI の対象が iPhone 15 Pro / 15 Pro Max・16 シリーズ・17 系へ広がり、応答が初期ベータより明確に速くなりましたDESIGN — iOS・iPadOS・macOS 27 向けの Apple 純正デザインキットが Figma と Sketch 向けに公開されました。新 OS の UI を組む段階で参照できますCANARY — Android 17(Cinnamon Bun)は従来の Developer Preview を廃し、継続更新される Canary ビルドへ移行しました。検証のタイミング設計が変わりますSPARK — Android 17 の Gemini Spark は、アプリを直接操作して配車の予約や注文といった複合的な作業を自動化しますSCALE — Rork は a16z から $2.8M を調達し、月間訪問は74万件規模まで伸びていますNATIVE — Rork Max では AR / LiDAR スキャン、Metal を使った 3D、Dynamic Island、Siri Intents、HealthKit、NFC、App Clips、Core ML まで届きますIOS27 — iOS 27 Developer Beta 4 で Siri AI の対象が iPhone 15 Pro / 15 Pro Max・16 シリーズ・17 系へ広がり、応答が初期ベータより明確に速くなりましたDESIGN — iOS・iPadOS・macOS 27 向けの Apple 純正デザインキットが Figma と Sketch 向けに公開されました。新 OS の UI を組む段階で参照できますCANARY — Android 17(Cinnamon Bun)は従来の Developer Preview を廃し、継続更新される Canary ビルドへ移行しました。検証のタイミング設計が変わりますSPARK — Android 17 の Gemini Spark は、アプリを直接操作して配車の予約や注文といった複合的な作業を自動化しますSCALE — Rork は a16z から $2.8M を調達し、月間訪問は74万件規模まで伸びています
記事一覧/開発ツール
開発ツール/2026-06-13中級

通知の許可は一度しか聞けない — Rork アプリにソフトアスク(事前確認)を実装して opt-in を底上げする

iOS の通知許可は一度拒否されると二度とダイアログを出せません。Rork(Expo)アプリで、起動直後に system prompt を撃つのではなく自前のソフトアスク画面を一枚挟み、価値が伝わった瞬間に許可を求める実装を expo-notifications で組みます。Android 13 の POST_NOTIFICATIONS、拒否後の設定誘導、opt-in 計測まで通します。

Rork525Expo156プッシュ通知19expo-notifications7オンボーディング10リテンション17

プレミアム記事

運用しているアプリのプッシュ通知の opt-in 率を並べて眺めていたとき、ある 1 本だけが極端に低いことに気づきました。中身はほぼ同じ構成の壁紙アプリなのに、通知を許可してくれた人の割合が他の半分以下だったのです。

原因はすぐに分かりました。その 1 本だけ、起動して最初の画面が出るより前に通知の許可ダイアログを出していたのです。ユーザーから見れば「何のアプリかまだ分からないのに、いきなり通知を求められた」状態でした。

iOS の通知許可には、個人開発者が必ず一度はぶつかる残酷な仕様があります。UNUserNotificationCenter の許可ダイアログは、アプリの生涯で一度しか自動表示できません。ユーザーが一度「許可しない」を押すと、コードから何度 requestPermissions() を呼んでも、もうダイアログは出ません。残された道は「設定アプリを自分で開いてもらう」だけになります。

つまり通知の opt-in は「いつ・どう聞くか」で決まります。起動直後に system prompt を撃つのをやめ、自前のソフトアスク(事前確認)画面を一枚挟む設計を、Rork(Expo)アプリに実装していきます。私自身が複数のアプリ運用で効果を確かめた構成です。

なぜ「一度しか聞けない」が opt-in を左右するのか

iOS では通知許可は三つの状態を持ちます。notDetermined(まだ聞いていない)、authorized(許可済み)、denied(拒否済み)です。重要なのは notDetermined のときだけ system prompt が表示でき、それ以外では requestPermissions() が即座に現在の状態を返すだけで、何も表示されないという点です。

notDetermined は、アプリの生涯でたった一回のチャンスです。ここで雑に消費してしまうと、二度と取り戻せません。

一方ソフトアスクは、私たちが自由に何度でも出せる「自前の UI」です。ここで断られても iOS の状態は notDetermined のまま保たれます。だから「自前ダイアログで一旦聞いて、同意してくれた人にだけ system prompt を出す」という二段構えが成立します。system prompt の前に一段クッションを置くことで、貴重な一回を本気で許可してくれそうな人にだけ使えるのです。

私の手元の運用では、起動直後に system prompt を撃っていたアプリと、ソフトアスクを挟んで価値が伝わった後に聞くアプリとで、最終的な OS 許可率に 2 倍以上の差が出ていました。通知は再訪のきっかけそのものなので、この差はそのまま AdMob やサブスクの収益にも効いてきます。

全体の流れを先に決める

実装に入る前に、判断の順序を固めておきます。コードはこの順序をそのまま写したものになります。

  1. アプリ起動時に現在の許可状態を読む。authorized ならもう何もしない
  2. denied なら自前ダイアログは出さず、必要な場面で「設定で通知をオンにできます」という導線だけ出す
  3. notDetermined のときだけ、ソフトアスクを出す「きっかけ」が来たかを判定する
  4. きっかけが来たらソフトアスク画面を表示する
  5. ソフトアスクで「オンにする」が押されたら、初めて system prompt(requestPermissions())を撃つ
  6. 「あとで」が押されたら状態は触らず、次のきっかけまで待つ

この 6 ステップのうち、多くのアプリが 3 と 4 を飛ばして起動直後に 5 をやってしまっています。クッションを置く価値はここにあります。

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

この記事の続きを読む

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

この記事で得られること
起動直後に system prompt を撃つと iOS では一度の拒否で永久に再表示できなくなる仕組みを理解し、ソフトアスクで「自前ダイアログ → 同意した人だけに system prompt」という二段構えを expo-notifications で実装できるようになる
通知の価値が伝わった瞬間(保存・完了・3 回目の起動など)まで許可を遅延させる『きっかけ』判定を TypeScript の状態管理で組み、許可率を計測する 3 つのイベント(提示・同意・OS 許可)を設計できるようになる
拒否されたユーザーを Linking.openSettings() で設定アプリへ誘導する復帰導線と、Android 13 の POST_NOTIFICATIONS ランタイム権限の差分を、本番運用の落とし穴込みで実装できるようになる
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

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

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

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

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

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

関連記事

開発ツール2026-07-17
許可を聞かずに通知を届ける — Rork アプリの provisional 認可と、Expo の定番コードが握りつぶすもの
iOS には許可ダイアログを出さずに通知を配り始める provisional 認可があります。ところが Expo 公式が載せている定番の登録コードをそのまま使うと、provisional で通った端末が「拒否」として扱われ、避けたかったはずのダイアログが出ます。granted が false になる仕組みから、5値で許可状態を扱うフック、静かな配信を前提にした通知設計、昇格を求める判断、計測の分離までを実装込みで整理しました。
開発ツール2026-06-16
Expo のプッシュ通知トークンを本番で取りこぼさないために整えたこと
Rork で生成した Expo アプリに再訪促進のプッシュ通知を入れたところ、配信数がアクティブ数より明らかに少ない事態に直面しました。原因はトークンの取りこぼしと失効放置でした。取得から更新、サーバー保存、失効掃除までの運用設計を実装コード付きで記録します。
開発ツール2026-06-14
Rork アプリのプッシュ許可、いきなり出して断られていませんか — 事前許諾で取りこぼしを減らす設計
Rork(Expo)で作ったアプリの起動直後に OS のプッシュ許可ダイアログを出すと、断られた瞬間にもう二度と出せなくなります。一度断られると再表示できない iOS の仕様を踏まえ、自前の事前許諾画面で許可率を底上げする設計を、実装コード込みで整理しました。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →