数年前、運用中のアプリにホーム画面ウィジェットを追加したところ、機能はほぼ同じままなのに起床時間帯の起動数が目に見えて増えた経験があります。以来、私は新しい「置き場所」が OS に増えるたびに、機能追加より先に導線追加を検討するようになりました。
iOS 18 で増えた置き場所が、コントロールセンターです。WidgetKit の ControlWidget を使うと、自作のボタンやトグルをコントロールセンター・ロック画面・アクションボタンに配置できます。Rork Max はネイティブ Swift と拡張ターゲットを扱えるため、この領域も指示の出し方さえ押さえれば届きます。
機能としては地味です。ただ、個人開発のアプリが毎日思い出してもらうための装置として、コストに対する効きは良い部類だと考えています。
導線としての位置づけ — 既存の置き場所との違い
すでにホーム画面ウィジェットや App Shortcuts を実装している方向けに、性格の違いを整理します。
| 観点 | ホーム画面ウィジェット | App Shortcuts(Siri/Spotlight) | ControlWidget |
|---|---|---|---|
| ユーザーの操作コスト | ホーム画面へ移動して視認 | 検索または発話 | 画面右上から一振り(どの画面からでも) |
| 表現力 | 高い(情報表示が主役) | 低い(テキスト中心) | 低い(アイコンと1アクション) |
| 向いている機能 | 状態の常時表示 | 名前で呼べる操作 | 反射的に使う単発操作 |
ControlWidget の本質は「どの画面からでも1スワイプで届く」ことです。表現力を捨てる代わりに到達コストを最小化しています。メモの新規作成、記録の開始・停止、今日の1件を開く——考えずに指が動く類の操作をひとつだけ選んで置く場所です。
リテンションの文脈で言えば、起動のきっかけを OS の一等地に常駐させる意味があります。広告収益で運営しているアプリなら、DAU の底上げはそのまま収益の底上げです。私自身、AdMob 中心で運営してきた経験から、この種の「思い出してもらう装置」への投資は機能追加より回収が読みやすいと感じています。
最小実装 — アプリを開くボタン
ControlWidget はウィジェット拡張ターゲットの中に定義します。もっとも単純な、アプリの特定画面を開くボタンから始めます。
import WidgetKit
import SwiftUI
import AppIntents
// コントロールから起動されるインテント。openAppWhenRun でアプリを前面に出す
struct OpenQuickMemoIntent: AppIntent {
static let title: LocalizedStringResource = "クイックメモを開く"
static let openAppWhenRun: Bool = true
func perform() async throws -> some IntentResult & OpensIntent {
// アプリ側は onOpenURL やシーン復元でこの遷移を受ける
return .result(opensIntent: OpenURLIntent(URL(string: "myapp://quick-memo")!))
}
}
struct QuickMemoControl: ControlWidget {
var body: some ControlWidgetConfiguration {
StaticControlConfiguration(kind: "com.example.myapp.quickmemo") {
ControlWidgetButton(action: OpenQuickMemoIntent()) {
Label("クイックメモ", systemImage: "square.and.pencil")
}
}
.displayName("クイックメモ")
.description("どの画面からでもメモ入力を開きます。")
}
}ポイントは2つです。openAppWhenRun = true を忘れると、インテントはバックグラウンドで実行されてアプリが前面に出ません。そして深いリンク先(この例では myapp://quick-memo)をアプリ側で受ける実装が別途必要です。コントロールは玄関であって、案内はアプリ本体の仕事です。