オンボーディングにアプリブロックの設定を入れる案
Focusity iOS / 下書き 2026-10-18。アプリのコードは変えていません。画面は実コードの文言と配色(Theme.swift のダーク値)から起こしたモックです。
現行いまある画面
再利用既存の画面をそのまま使う
新規新しく作る画面
OSOS の許可ダイアログ
腕A/B で変わる箇所
結論(推奨案 A)
- 建築を選んだ直後に「この建築を建てるあいだ、気が散るアプリを止めませんか?」を1枚挟む。「あとで」で飛ばせる。
- 進んだ人は既存の説明カード(ShieldIntroView → DataPrivacyView → ScreenTimeIntroView)を通り、スクリーンタイムの OS ダイアログを1回だけ出す。
- 許可したらアプリ選択へ。上に「4つまで無料。全部・カテゴリごと止めたいなら Premium」の帯を出す。
- 5個以上かカテゴリを選んで保存したら、案内シート(Premium を見る/選び直す)を出す。
- そのあとは今と同じ。ホームの「スタート」→ チュートリアルの実セッション。通知の許可は、自分の集中を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
あとで止めるアプリ保存
止めたいアプリを4つ選んでくださいcap4
3 / 4(無料) 全部止めたい・カテゴリごと止めたいなら Premium
SNSカテゴリは Premium
Instagram
TikTok
YouTube
X
エンターテインメント
下の一覧は OS の FamilyActivityPicker で、件数の制限もカテゴリの非表示もできない。判定は保存を押したときに行う。「カテゴリは Premium」の札は帯の文で伝える(一覧には付けられない)。
→
新規上限の案内シート cap4 のみ
止めたいアプリを4つ選んでください
無料で止められるのは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 は、設定しても効くのは翌日以降の集中から。
- OS のダイアログの間が空く。案 A のスクリーンタイムは集中の前、通知の事前確認は「自分の1本目の直後」で、別の日になることが多い。案 B は集中後の列に入るので、通知の確認と同じ「集中のあと」の時間帯に寄る。
- 集中後の列はすでに混んでいる(ウィジェット案内・インストール特典・期間限定の告知・課金画面)。案 B はここに1枚足すことになる。
- 10/18 の分析では、初日に1本やり切った人どうしで比べても残る差はブロック設定だけだった(48.0% 対 33.7%、人数は少ない)。設定する人を増やすなら、全員が通る位置に置くほうがよい。
案 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_shown | onboarding_block_offer_closed | outcome: 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_shown | block_cap_sheet_closed | reason: 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. 気づいた懸念
- 通知ダイアログとの衝突。上の前提のとおり、段A(集中の開始で通知を聞かない)が main に入るまでは、この案を出さない。
- 倍速の腕 A と4個上限が食い違う。腕 A は「1個ごとに ×0.1、最大 ×2.0(10個)」とうたい、選ぶ画面に「建築 ×1.4速」の札を出す。cap4 の無料ユーザーは ×1.4 で止まるので、説明カード3枚目と札の文言を cap4 用に直すか、オンボでは札を隠す。
- OS のピッカーは件数もカテゴリも縛れない。保存の時点で判定するしかない。カテゴリはアプリ数に直せないので「カテゴリを1つでも含めば Premium」と決める必要がある。
- OnboardingPhase は Int の rawValue で保存している。途中に case を足すと既存の保存値がずれる(pickApps・pickBuilding のときにも起きた)。新しい段は phase に足さず、pickBuilding の確定後に出すカバーとして持つか、末尾に足して遷移で飛ばす。
- ShieldOptInFlowView には「あとで」が無い(✕ だけ)。オンボから入ったときは「あとで」を出し、閉じた理由を later として送る。
- スキップ経路(intro 全体の「スキップ」→ guideNewConstruction)では勧めが出ない。どちらの経路でも出すかを決める。
- 課金画面との重なり。上限シートから課金画面へ入った人は、オンボ完了直後の課金画面と定期の課金画面を短い間に2回見る可能性がある。シート経由で見せたら
recurringPaywall.markShown() を同じく呼ぶ。
- 許可を断った人にもう一度聞く入口。オンボで断ったら盾から入り直すしかない。ホームの盾に小さな点を付けるかは別に決める。
- legacy の判定。オンボの途中でアプリを保存した新規が、保存済みの選択があることを理由に legacy(無制限)と判定されないよう、腕の割り当てを保存より先に確定させる。
- Android は Flutter 側に別の実装が要る。iOS の文言を先に固めてから移す。
出典: 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)。