オンボーディングにアプリブロックの設定を入れる案

Focusity iOS / 下書き 2026-10-18。アプリのコードは変えていません。画面は実コードの文言と配色(Theme.swift のダーク値)から起こしたモックです。

現行いまある画面 再利用既存の画面をそのまま使う 新規新しく作る画面 OSOS の許可ダイアログ 腕A/B で変わる箇所
結論(推奨案 A)
  1. 建築を選んだ直後に「この建築を建てるあいだ、気が散るアプリを止めませんか?」を1枚挟む。「あとで」で飛ばせる。
  2. 進んだ人は既存の説明カード(ShieldIntroView → DataPrivacyView → ScreenTimeIntroView)を通り、スクリーンタイムの OS ダイアログを1回だけ出す。
  3. 許可したらアプリ選択へ。上に「4つまで無料。全部・カテゴリごと止めたいなら Premium」の帯を出す。
  4. 5個以上かカテゴリを選んで保存したら、案内シート(Premium を見る/選び直す)を出す。
  5. そのあとは今と同じ。ホームの「スタート」→ チュートリアルの実セッション。通知の許可は、自分の集中を1本やり切った後のシートのまま動かさない。

端末の中のボタンは押せます。押すと、横の流れの中で次の画面へ移ります。

1. いまのオンボーディング(実コードの順番)

流れの状態は OnboardingPhase(intro → pickBuilding → guideStart → demo → completed)。pickApps は残っていますが、OnboardingCoordinator.advance() で飛ばしています。いまはオンボのどこでもブロックを勧めていません。

現行アンケート3問OnboardingSurveyView
1 / 3
Focusity を
どこで知りましたか?
TikTok
Instagram
App Store で検索
友だち・知り合い

初回だけ。スキップは無い。OnboardingView の surveyChannel / surveyAge / surveyGender。

→
現行ウェルカムOnboardingWelcomeView
姫路城が石垣から建っていく
累計集中時間0 → 285 分

押し続けると完成し、ボタンが「はじめる」に変わる。次の mechanicCarousel は何も描かずに閉じる(計測の段名だけ残している)。

→
現行建築を選ぶOnboardingBuildingPickerView
建てたい建築を選ぼう
完成形を見て、好きな建築を選ぼう。集中を重ねて育てていけます。
サグラダ・ファミリア
姫路城
金閣寺
タージ・マハル

確定で着工し、phase は guideStart へ飛ぶ。

→
現行ホームでスタートへ誘導HomeView / SpotlightCoachOverlay
いま建てている建築
ここを押して集中をはじめよう
スタート

暗幕つきのスポットライト。「スキップ」は暗幕より上に重ねている。

→
現行集中タイム、スタート!TutorialAnnouncementView.start
⏱
集中タイム、スタート!
タップで次へ

送り切ると本物の集中が始まり、その瞬間にオンボ完了(completed)。main では休憩5分の既定でポモドーロになり、開始時に通知の OS ダイアログが出る。

→
現行チュートリアルの締めTutorialAnnouncementView.skipNotice
25:00 のカウントダウン
今回はチュートリアルなので、25分はスキップします
本番では、集中した分だけ建築が進みます。

カウントダウンを矢印で指して「0になったら終了」→ 設定分を完了として計上。

→
現行ウィジェット案内・特典WidgetGuideView / InstallBonusAnnouncementView
ホーム画面に飾れます
ウィジェットの見本
インストール特典最初の建築は ×3 の速さ

初回セッション後の案内(consumePostFirstSessionGuides)。

→後日
自分の1本目
現行通知の事前確認ReminderPermissionSheet
明日も、続けませんか?

毎日20時ごろに1回だけ、建築の続きをお知らせします。集中した日は届きません。

自分の集中を1本やり切った直後に1回だけ。チュートリアルの完了では出さない。押した人の90%が許可する経路。

ブロックの入口は、いまはホーム左上の盾アイコンだけ。未許可で押すと ShieldOptInFlowView(intro → privacy → screen_time → OS 許可)→ AppPickerView。

2. 推奨案 A:建築を選んだ直後に差し込む

「この建築を建てるあいだ止める」と、選んだばかりの建築に結びつけて勧めます。OS のダイアログはスクリーンタイムの1回だけです。通知の許可はここでは聞きません。

現行建築を選ぶ
建てたい建築を選ぼう
サグラダ・ファミリア
姫路城
金閣寺
タージ・マハル

ここまでは今と同じ。

→
新規ブロックの勧め 腕: offer のみ
サグラダ・ファミリア(段1)
建てているあいだ、
気が散るアプリを止めませんか?
集中しているあいだだけ、選んだアプリが開かなくなります。cap4無料で4つまで選べます。

「あとで」は今の流れ(ホームのスタート)へ。ホームの盾からいつでも設定できる、と一言添える。

→
再利用説明カード3枚ShieldIntroView
✕
気が散るアプリを
集中するあいだだけ止める
🔒 選んだアプリが開かなくなるSNS や動画など気が散るアプリを選んでおくと、集中しているあいだは止まります。
🔓 終われば、すぐ元どおり集中が終わるか途中でやめると、自動で外れます。
⚡ ブロックするほど速く進む倍速の腕 A だけ。B・C は「あとから変えられる」

既存のまま使う。オンボから入ったときだけ下に「あとで」を足す(いまは ✕ だけ)。

→
再利用プライバシーDataPrivacyView
✕
🛡
どのアプリをどれだけ使ったか——その記録は Apple が守ります。開発者からは見えないので、安心してお使いください。

文言は変えない。

→
再利用スクリーンタイムの説明ScreenTimeIntroView
✕
スクリーンタイム
へのアクセスを許可
集中タイマー中に対象アプリをブロックするには、スクリーンタイムの利用許可が必要です。

「次へ」で OS の許可を求める。

→
OSスクリーンタイムの許可
“Focusity”にスクリーンタイムへのアクセスを許可しますか?
許可すると、このアプリがあなたのアクティビティを確認し、アプリの使用を制限できるようになります。
続ける
許可しない

この区間で出す OS ダイアログはこれ1つ。断ったら責めずにホームのスタートへ進む。

→
新規選ぶ画面(帯を足す)AppPickerView
SNSカテゴリは Premium
Instagram
TikTok
YouTube
X
エンターテインメント

下の一覧は OS の FamilyActivityPicker で、件数の制限もカテゴリの非表示もできない。判定は保存を押したときに行う。「カテゴリは Premium」の札は帯の文で伝える(一覧には付けられない)。

→
新規上限の案内シート cap4 のみ
無料で止められるのは4つまでです

いま 6 つ選んでいます。全部止めたいときや、カテゴリごと止めたいときは Premium でどうぞ。

カテゴリを選んだときの文:「カテゴリごと止めるのは Premium の機能です。アプリを4つまで選べば無料で止められます。」

「選び直す」は選んだものを残したまま一覧へ戻す(空にしない)。シートを下へ払っても「選び直す」と同じ扱い。

→Premium
を見る
再利用課金画面PaywallHostView
✕
Premium
アプリもカテゴリも、何個でも止められるこの入口から来た人には、この行を一番上に出す
Premium の建築

source は block_cap。買ったらそのまま保存、閉じたら選んだものを残して一覧へ戻す。

→
新規保存できた
✓ 4つのアプリを、集中のあいだ止めます
いま建てている建築

そのまま今のホーム誘導へ合流する。

→
現行ホームでスタートへ誘導
いま建てている建築
ここを押して集中をはじめよう
スタート

「あとで」「許可しない」の人もここへ来る。どの経路でもここで合流する。

→
現行チュートリアル以降
⏱
集中タイム、スタート!
ブロックを設定した人は、ここから実際に止まる

通知の事前確認は今どおり「自分の1本目の直後」。オンボの中では聞かない。

前提:集中を始めた瞬間の通知ダイアログを先に止めること。 main ではチュートリアルの集中もポモドーロ(休憩5分の既定)になり、開始時に FocusViewModel が通知の許可を OS に求めます。このままだと、スクリーンタイムのダイアログの十数秒後に通知のダイアログが続きます。10月はこの経路で許可率が 77% から 6〜8% に落ちました。worktree の段A(開始時に聞かない)を先に合流してから、この案を入れてください。

3. 別案 B:チュートリアルの集中を終えた直後に差し込む

「次の集中から止めよう」と、集中を1回見たあとに勧めます。中の画面(勧め → 説明カード → OS → 選ぶ画面 → 上限シート)は案 A と同じで、置き場所だけが違います。

現行チュートリアルの締め
今回はチュートリアルなので、25分はスキップします

ここまで今と同じ。

→
新規次の集中から止める 腕: offer のみ
次の集中から、
気が散るアプリを止めませんか?
無料で4つまで選べます。

ウィジェット案内・インストール特典より前に出す。

→
再利用説明カード → OS → 選ぶ
ShieldIntroView
DataPrivacyView
ScreenTimeIntroView
OS:スクリーンタイム
選ぶ画面+上限シート

中身は案 A の a3〜a9 と同じ。

→
現行ウィジェット案内・特典
ホーム画面に飾れます
インストール特典

集中後の列が「ブロック → ウィジェット → 特典」と3枚続く。

案 A を推す理由

案 B の強みは、集中を一度見てから勧めるので「止める意味」が伝わりやすいこと。案 A で勧めの通過率が低ければ、案 B を次の A/B にする。

4. A/B の腕で変わる画面

腕は2つで、独立に振ります(倍速の腕・ホームの1枠の腕とはソルトを分ける)。組み合わせは 2×2 の4通りです。

画面勧めあり × cap4勧めあり × unlimited勧めなし × cap4勧めなし × unlimited
a2 ブロックの勧め出す・「無料で4つまで」出す・4つの文を出さない出さない(今の流れのまま)
a3〜a6 説明カード・OS出すオンボでは出さない(ホームの盾から入ったときは今どおり)
a7 選ぶ画面の帯「4つ選んでください」+目盛り+Premium の一文「止めたいアプリを選んでください」だけ盾から開いたとき同じ帯帯なし(今どおり)
a8 上限シート5個以上かカテゴリで出す出さない盾から開いたとき同じ判定出さない
a9p 課金画面シートから入れる入口なしシートから入れる入口なし

cap4 と unlimited は「次の版から入った新規」だけに振る。既存ユーザーはどちらの腕にも入れず、常に無制限。

5. 計測イベントの案(表示と結果を対にする)

画面表示結果主なパラメータ
a2 ブロックの勧めonboarding_block_offer_shownonboarding_block_offer_closedoutcome: setup / later、duration_ms(端末の時計)、block_cap_arm
a3〜a5 説明カードshield_opt_in_step_shown(既存)shield_opt_in_closed(既存)既存の step / outcome に entry: onboarding / home_shield を足す。outcome に later を足す
a7 選ぶ画面app_picker_shown(既存)app_picker_closed・app_block_saved(既存)entry: onboarding を足す。app_bucket・domain_bucket・has_category を分けて送る(今は合計の層だけで、4個の境目が見えない)
a8 上限シートblock_cap_sheet_shownblock_cap_sheet_closedreason: over_limit / category、selected_bucket、entry、outcome: view_premium / reselect / swiped
a9p 課金画面paywall_shown(既存)purchase_completed(既存)source: block_cap。variant・trigger・built_bucket・session_bucket の5つを両方に載せる
流れ全体onboarding_step_complete(既存)に phase: blockOffer を足すユーザー範囲に onboarding_block_arm と block_cap_arm

クエリは scripts/analytics/queries/onboarding_block_offer.sql を1本。主指標は「7日以内に別の日に集中した割合」、副指標は勧めの通過率・OS 許可率・上限シートからの購入率。GA4 のイベント範囲の枠は残りわずかなので、足す前に空きを確かめる。

6. 気づいた懸念

出典: OnboardingView.swift / OnboardingPhase.swift / OnboardingCoordinator.swift / RootTabView.swift / ShieldOptIn.swift / ShieldOptInFlowView.swift / AppPickerView.swift / ReminderPermissionPrompt.swift / FocusViewModel.swift / FocusMultiplier.swift / Theme.swift(2026-10-18 の main)。