WWDC Quick Look 💓 By SwiftGGTeam
Meet the Screen Time API

Meet the Screen Time API

元の動画を見る

ハイライト

Apple は、iOS および iPadOS 15 で Screen Time API を導入しました。これにより、ペアレンタル コントロール アプリは、アプリと Web サイトの使用状況データをデバイスに残したまま、ファミリー コントロール、デバイス アクティビティ、および管理対象設定を通じて保護者の承認を要求し、使用時間を監視し、制限を強制することができます。

主要内容

ペアレンタルコントロールアプリの主な問題は常に子供のデバイスにありました。

親がルールを設定すると、通常、子供はアプリを積極的に開かなくなります。開発者にとって、適切なタイミングでコードを実行し、ルールが常に有効であることを確認することは困難です。たとえば、上十点後のシールドや、学校向けアプリの三十分後に解除されるアプリのシールド、輸送後台のタスクは、このような状況には適していません。

プライバシーの問題はよりデリケートです。ペアレンタルコントロールアプリは、アプリの使用記録、Web サイトのアクセス記録、カテゴリの選択などの情報に遭遇します。開発者は何を制限するかを知る必要がありますが、子供がどのアプリを使用したか、どの Web サイトにアクセスしたかをサーバーに送信すべきではありません。

Screen Time API は、これを 3 つのフレームワークに分類します。

ファミリー コントロールは、承認とプライバシーの境界を担当します。これはファミリー共有に依存しており、保護者はスクリーンタイム API を使用してアプリを承認する必要があり、アプリ、Web サイト、カテゴリを表すために不透明なトークンを使用します。

デバイス アクティビティは、アプリが起動していないときに拡張機能を実行する責任があります。開発者は時間枠と使用量のしきい値を宣言し、時間の開始時、終了時、またはしきい値に到達したときに、システムが内線番号を呼び出します。

管理設定は実際に制限を適用する責任があります。拡張機能を有効にすると、アカウントのロック、パスワード変更の禁止、Web トラフィックのフィルタリング、アプリのブロック、または以前に設定した設定のブロック解除を行うことができます。

これら 3 つのフレームワークは相互に接続されて完全なプロセスを形成します。保護者が子デバイスで承認し、親デバイスがルールを選択し、ルールが子デバイスに同期され、管理設定の制限が子デバイスのデバイス アクティビティ拡張機能によってトリガーされます。

詳細

ファミリーコントロール: 最初に保護者に許可してもらいます

07:22) 宿題デモの最初のステップは、アプリの起動時にファミリーコントロールの承認をリクエストすることです。この演説では、この要請には家族の後見人の承認が必要であることが明らかになった。初めて実行するとき、システムは認証プロンプトを表示します。保護者が「許可」をクリックした後、Apple ID とパスワードで認証する必要があります。

import FamilyControls
import SwiftUI

@main
struct HomeworkApp: App {
    @StateObject private var model = HomeworkModel()

    var body: some Scene {
        WindowGroup {
            ContentView()
                .environmentObject(model)
                .task {
                    AuthorizationCenter.shared.requestAuthorization { result in
                        switch result {
                        case .success:
                            model.isAuthorized = true
                        case .failure:
                            model.isAuthorized = false
                        }
                    }
                }
        }
    }
}

final class HomeworkModel: ObservableObject {
    @Published var isAuthorized = false
}

キーポイント:

  • import FamilyControls 引入 Family Controls 框架。
  • AuthorizationCenter.shared共有認証センターを使用してリクエストを開始します。
  • requestAuthorization保護者の承認プロセスが開始されます。
  • .success現在の子供のデバイスが認証されていることを示します。
  • .failureこれは、トークの 08:06 で言及されている、ファミリー共有の子アカウントの一部ではない iCloud アカウントにログインしたときに発生する可能性があります。

08:25) 認証が成功すると、システムレベルの保護も行われます。子供のデバイスは iCloud からサインアウトできません。アプリにネットワーク拡張機能に基づくデバイス上の Web コンテンツ フィルターが含まれている場合、そのフィルターは自動的にインストールされ、子供による削除が防止されます。

デバイスアクティビティ: 時間枠に従って拡張機能を実行します。

09:31) 子供たちはペアレンタルコントロールアプリを積極的に開かないので、宿題はデバイスアクティビティスケジュールを使用して毎日ブロックを設定します。講演では、スケジュールは時間枠であり、システムは時間枠の最初と最後にアプリ拡張機能を呼び出すと述べました。

import DeviceActivity

final class HomeworkMonitor: DeviceActivityMonitor {
    override func intervalDidStart(for activity: DeviceActivityName) {
        // これは、タイム ウィンドウの開始後、システムが初めてデバイスを使用するときに呼び出されます。
    }

    override func intervalDidEnd(for activity: DeviceActivityName) {
        // これは、時間枠が経過した後、システムが初めてデバイスを使用するときに呼び出されます。
    }
}

キーポイント:

  • DeviceActivityMonitor拡張プリンシパルクラスです。
  • intervalDidStart対応する時間枠が始まります。
  • intervalDidEnd対応する時間枠が終了します。
  • トークでは 10:14 で、これら 2 つのメソッドが、デバイスが初めて使用されるとき (時間の開始時または終了後のいずれか) に呼び出されることが説明されています。

10:26) メインアプリはアクティビティ名とスケジュールを作成する必要があります。名前は、拡張機能内のアクティビティを識別するために使用されます。スケジュールは、監視の時間範囲を示すために使用されます。宿題のデモ アクティビティに名前を付けますdaily、毎日繰り返すように設定します。

import DeviceActivity
import Foundation

let daily = DeviceActivityName("daily")

let schedule = DeviceActivitySchedule(
    intervalStart: DateComponents(hour: 0, minute: 0),
    intervalEnd: DateComponents(hour: 23, minute: 59),
    repeats: true
)

let center = DeviceActivityCenter()
try center.startMonitoring(daily, during: schedule)

キーポイント:

  • DeviceActivityName("daily")この監視ルールに名前を付けると、内線コールバックも同じ名前を受け取ります。
  • DeviceActivitySchedule時間の境界を定義します。
  • repeats: trueこのルールが繰り返し実行されることを示します。
  • DeviceActivityCenter 负责注册监控。
  • startMonitoringシステムに名前とスケジュールを指定すると、システム コールによって拡張されます。

ファミリー アクティビティ ピッカー: 保護者がアプリ、ウェブサイト、カテゴリを選択できるようにします

11:09) 制限する前に、保護者が何を制限したいのかを知る必要があります。 Family Controls は、SwiftUI コンポーネント Family Activity Picker を提供します。保護者は家族が利用するアプリやWebサイト、カテゴリからアイテムを選択できる。

import FamilyControls
import SwiftUI

struct ContentView: View {
    @State private var isPickerPresented = false
    @State private var selection = FamilyActivitySelection()

    var body: some View {
        Button("Select discouraged apps") {
            isPickerPresented = true
        }
        .familyActivityPicker(
            isPresented: $isPickerPresented,
            selection: $selection
        )
    }
}

キーポイント:

  • FamilyActivitySelectionガーディアンの選択を保存します。
  • Buttonセレクター表示をトリガーします。
  • familyActivityPickerそれはスピーチで言及された SwiftUI ビュー修飾子です。
  • selectionApp モデルにバインドすると、ガーディアンの選択の更新がモデルに書き戻されます。
  • 選択結果は不透明なトークンであり、対応するアプリ、Web サイト、カテゴリを制限または監視するために使用されます。

04:08) これらのトークンは、設計上のプライバシーの鍵となります。このシステムでは、アプリが制限や監視のためにトークンを使用することを許可していますが、トークンはアプリや Web サイトの読み取り可能な ID を明らかにするものではなく、ファミリー共有グループ以外のユーザーは子供が具体的に何を使用しているかを知ることができません。

管理設定: 拡張機能内でブロックおよびブロック解除

11:59) ガーディアンの選択を取得した後、拡張機能は時間枠の開始時にアプリのブロックを設定し、時間枠の終了時にブロックをクリアします。講演では、アプリケーション シールドの制限にアクセスするには管理設定モジュールをインポートする必要があることが明確に述べられていました。

import DeviceActivity
import ManagedSettings

final class HomeworkMonitor: DeviceActivityMonitor {
    private let store = ManagedSettingsStore()
    private let model = HomeworkModel.shared

    override func intervalDidStart(for activity: DeviceActivityName) {
        store.shield.applications = model.discouragedSelection.applicationTokens
    }

    override func intervalDidEnd(for activity: DeviceActivityName) {
        store.shield.applications = nil
    }
}

キーポイント:

  • import ManagedSettings 引入限制能力。
  • ManagedSettingsStoreデバイスに適用する制限を保存します。
  • store.shield.applicationsスピーチにおけるアプリケーションシールド制限に対応。
  • model.discouragedSelection.applicationTokensファミリー アクティビティ ピッカーからの不透明なトークン。
  • nil以前に設定したアプリケーション ブロックを削除することを示します。この操作については、12:14 のスピーチで直接説明されています。

12:30) 管理設定はアプリのブロックに限定されません。演説で挙げられた制限には、アカウントの作成や削除のブロック、アプリやウェブサイトの完全なブロック、年齢によるメディアコンテンツの制限も含まれる。メディア アプリは、映画やテレビのコンテンツ制限を読み取ることもでき、ファミリー コントロールの承認は必要ありません。

Device Activity Events:用使用阈值解除限制

13:51) 宿題デモの 2 番目のルールは、子供たちが刺激的なアプリを十分に使用した後、エンターテイメント アプリのブロックを解除することです。ここでは、デバイス アクティビティ イベントを使用して、使用量のしきい値を監視します。

import DeviceActivity
import FamilyControls
import Foundation

let daily = DeviceActivityName("daily")
let encouraged = DeviceActivityEvent.Name("encouraged")

let event = DeviceActivityEvent(
    applications: model.encouragedSelection.applicationTokens,
    threshold: DateComponents(minute: 30)
)

let center = DeviceActivityCenter()
try center.startMonitoring(
    daily,
    during: schedule,
    events: [encouraged: event]
)

キーポイント:

  • DeviceActivityEvent.Name("encouraged")イベントに名前を付けます。拡張コールバックはこの名前を使用してイベントを識別します。
  • applications保護者が選んだ心強いアプリトークンを使用してください。
  • threshold蓄積される使用時間を示します。音声では使用しきい値と呼ばれます。
  • events13:41に記載されているスケジュールに登録してください。
  • しきい値に達すると、システムはデバイス アクティビティ モニター拡張機能を呼び出します。

14:46) による拡張機能eventDidReachThreshold通知を受け取ります。宿題を受けていますencouragedイベント後、アプリのブロックを次のように設定します。nil、以前にブロックされたアプリを再び利用できるようになります。

import DeviceActivity
import ManagedSettings

final class HomeworkMonitor: DeviceActivityMonitor {
    private let store = ManagedSettingsStore()

    override func eventDidReachThreshold(
        _ event: DeviceActivityEvent.Name,
        activity: DeviceActivityName
    ) {
        if event == DeviceActivityEvent.Name("encouraged") {
            store.shield.applications = nil
        }
    }
}

キーポイント:

  • eventDidReachThreshold 在使用阈值达到时被调用。
  • eventトリガーされたイベントの名前を示します。
  • activity 表示事件属于哪条 Schedule。
  • 裁判官encouraged次に、ブロックを解除して、他のイベントによる誤ったトリガーを回避します。
  • store.shield.applications = nil以前のブロック解除方法を再利用します。

カスタム シールド: システム シールド ページを独自のエクスペリエンスにします

15:27) デフォルトのブロック ページはスクリーンタイムから来ています。管理設定には 2 つの拡張ポイントも用意されています。1 つはシールド ページの外観をカスタマイズするためのもの、もう 1 つはシールド ページのボタン アクションを処理するためのものです。

import ManagedSettings
import UIKit

final class HomeworkShieldConfigurationProvider: ShieldConfigurationProvider {
    override func configuration(shielding application: Application) -> ShieldConfiguration {
        ShieldConfiguration(
            backgroundBlurStyle: .systemMaterial,
            backgroundColor: .systemBackground,
            icon: UIImage(systemName: "book.closed.fill"),
            title: ShieldConfiguration.Label(text: "Homework first", color: .label),
            subtitle: ShieldConfiguration.Label(text: "Read for 30 minutes to unlock this app.", color: .secondaryLabel),
            primaryButtonLabel: ShieldConfiguration.Label(text: "Ask for Access", color: .white),
            primaryButtonBackgroundColor: .systemBlue,
            secondaryButtonLabel: ShieldConfiguration.Label(text: "OK", color: .systemBlue)
        )
    }
}

キーポイント:

  • ShieldConfigurationProvider外観カスタマイズ拡張機能のメインクラスです。
  • configuration現在ブロックされているアプリケーションを受信します。
  • ShieldConfiguration背景効果、背景色、アイコン、タイトル、サブタイトル、ボタンのラベルを返します。
  • システムは、宿題によってブロックされたアプリにこの設定を表示します。これについては、トークで 16:37 で説明されています。

16:50) 2 番目の拡張ポイントはボタンを処理します。拡張機能は継承する必要がありますShieldActionHandler、書き換えますhandle、完了ハンドラーを呼び出してシールド アクションの応答を返します。トークに記載されている対応には、ブロックされたアプリを閉じるか、アクションを遅らせてブロック構成を再描画することが含まれます。

import ManagedSettings

final class HomeworkShieldActionHandler: ShieldActionHandler {
    override func handle(
        action: ShieldAction,
        for application: ApplicationToken,
        completionHandler: @escaping (ShieldActionResponse) -> Void
    ) {
        switch action {
        case .primaryButtonPressed:
            completionHandler(.defer)
        case .secondaryButtonPressed:
            completionHandler(.close)
        @unknown default:
            completionHandler(.close)
        }
    }
}

キーポイント:

  • ShieldActionHandlerボタンアクション拡張のメインクラスです。
  • handleユーザーが主ボタンを押したか副ボタンを押したかを内線に伝えます。
  • application現在ブロックされているアプリトークンを示します。
  • completionHandlerを呼び出す必要があり、スピーチではこの要件が 17 時 14 分に明らかにされています。
  • .defer保護者のアクションを待機し、ブロック ページにステータスを更新させるために使用できます。
  • .closeブロックされているアプリを閉じます。

重要ポイント

1. 娯楽ではなく子供向けの学習モード

  • 対処法: お子様が読書、学習、クリエイティブなアプリを 30 分間使用した後、ゲーム アプリやビデオ アプリのロックが自動的に解除されます。
  • 実行する価値がある理由: デバイス アクティビティ イベントは、推奨されるアプリの使用量のしきい値を監視でき、管理設定は以前のブロックを削除できます。
  • 開始方法: ファミリー アクティビティ ピッカーを使用して、保護者が 2 セットのアプリを選択できるようにします。使用DeviceActivityEventアプリを監視し、奨励します。でeventDidReachThresholdミドルハンドルstore.shield.applicationsに設定nil

2.一定時間フォーカスモード

  • 対処法: 毎日、夕食後から就寝前まで、ソーシャル、ゲーム、短いビデオ アプリを自動的にブロックします。
  • 実行する価値がある理由: デバイス アクティビティ スケジュールは、繰り返される時間枠の開始時と終了時に拡張機能を呼び出すことができるため、子供が積極的にアプリを開く必要がありません。
  • 開始方法: 作成するDeviceActivitySchedule、設定repeats: true;存在するintervalDidStartブロックを設定します。でintervalDidEndシールドをクリアします。

3. ホームWebフィルタリングツール

  • 対処方法: お子様のデバイス用にデバイス上の Web コンテンツ フィルターをインストールし、保護者のルールに従ってアクセス範囲を調整します。
  • 実行する価値がある理由: スピーチでは、ファミリー コントロールが承認されると、アプリ内のネットワーク拡張機能の Web コンテンツ フィルターが自動的にインストールされ、子供が削除することはできないと述べられました。
  • 開始方法: まず、ファミリー コントロール機能を追加します。保護者の承認を要求します。 Web フィルタリング ロジックを Network Extensions 拡張機能に組み込み、管理設定を使用して関連する制限を管理します。

4. コンテンツアプリの年齢制限保護

  • 対処方法: ビデオまたはテレビ アプリは、デバイス上の映画とテレビの制限に基づいて、不適切なコンテンツを非表示にします。
  • 実行する価値がある理由: 管理設定は、映画やテレビのコンテンツ制限を読み取るための API を提供します。講演では、この読み取りにはファミリー コントロールの承認が必要ないことが説明されています。
  • 開始方法: メディア アプリが起動するとき、またはコンテンツ リストを更新するときに、システムのメディア制限をお読みください。制限の結果を使用してコンテンツ リストをフィルタリングし、許可された年齢を超えるコンテンツが表示されないようにします。

5. ブランドのブロックページ

  • 対処方法: デフォルトのスクリーン タイム ブロック ページを、アプリのブランド、理由の説明、および [アクセスのリクエスト] ボタンを含むページに変更します。
  • 価値がある理由: カスタム シールドを使用すると、背景、アイコン、タイトル、サブタイトル、ボタンを設定し、拡張機能にボタンのアクションを処理させることができます。
  • 開始方法: 実装ShieldConfigurationProviderカスタムに戻るShieldConfiguration;成し遂げるShieldActionHandler主ボタンと副ボタンを処理します。主ボタンが戻る.defer保護者の確認を待ちます。

関連セッション

  • Apple’s privacy pillars in focus—Screen Time API のプライバシー設計と組み合わせて表示するのに適した、iOS 15 のプライバシー機能を推進するための Apple のエンジニアリング原則について説明します。
  • Meet the Location Button- オンデマンド認証用のロケーション ボタンを紹介し、システム制御が機密データの認証における煩雑さをどのように軽減できるかを示します。
  • Get ready for iCloud Private Relay— iCloud Private Relay がネットワーク レベルでのユーザー アクティビティへの露出をどのように軽減するかについて説明します。
  • Meet privacy-preserving ad attribution— アプリや Web サイト全体でのユーザー アクティビティを追跡せずに、広告のアトリビューションがどのように機能するかを説明します。

コメント

GitHub Issues · utterances