ハイライト
iOS 16 では、スクリーン タイム API の使用範囲が拡大されます。個々のユーザーがサードパーティ アプリにデバイスの使用習慣を管理する権限を与えることができるようになり、管理設定ストアは名前付きストレージをサポートし、アプリと拡張機能間で自動的に共有され、デバイス アクティビティには SwiftUI に基づくカスタム レポート機能が追加されました。
主要内容
ペアレンタルコントロールから個人の生産性まで
iOS 15 のスクリーンタイム API は、保護者による制限のシナリオでのみ使用できます。保護者は iCloud 認証を通じて子供のデバイスを管理します。この位置付けにより、アプリケーションのシナリオが制限され、ユーザーの使用時間の管理を支援したい多くの開発者がブロックされます。
iOS 16 では、新しい個別ユーザー認証モード (AuthorizationCenter.requestAuthorization(for: .individual))。ユーザーは自分のデバイスで直接認証するため、家族との共有関係は必要ありません。各デバイスは複数のアプリを認証でき、アプリのアンインストールや iCloud ログアウトに対する必須の制限も削除されます。
これは、Screen Time API の市場が「ペアレンタル コントロール」から「個人の効率化」に拡大したことを意味します。これは、集中ツール、習慣開発、デジタル ヘルス、その他の方向で使用できます。
名前付きストレージは複数のシナリオで競合を解決します
(04:20)
iOS 15 の管理設定ストアはプロセスごとに 1 つしかなく、アプリと拡張機能はまだ共有できません。 「平日はソーシャルアプリをブロックし、週末は開く」という要件を実現したい場合、コードを書くのは非常に面倒です。
iOS 16 は、プロセスごとに最大 50 の名前付きストアの作成をサポートしており、アプリとすべての拡張機能の間で自動的に共有されます。
let gamingStore = ManagedSettingsStore(named: .gaming)
let socialStore = ManagedSettingsStore(named: .social)
異なるストアの設定が競合する場合は、最も厳しい設定が有効になります。たとえば、ゲーム ストアがゲーム Web サイトをブロックした場合、ソーシャル ストアがすべての制限をクリアしても、Web サイトはブロックされたままになります。
カスタム使用状況レポート
(06:35)
iOS 16 では、デバイス アクティビティ レポート拡張機能が追加されており、開発者は SwiftUI を使用して完全にカスタマイズされたデバイス使用状況レポートを作成できます。データはデバイス上でローカルに処理され、クラウド送信を伴わないため、ユーザーのプライバシーが保護されます。
詳細
個人的な承認をリクエストする
(03:09)
アプリの起動時に認証をリクエストします。
import SwiftUI
import FamilyControls
@main
struct Worklog: App {
let center = AuthorizationCenter.shared
var body: some Scene {
WindowGroup {
VStack {…}
.onAppear {
Task {
do {
try await center.requestAuthorization(for: .individual)
} catch {
print("Failed to enroll with error: \(error)")
}
}
}
}
}
}
キーポイント:
AuthorizationCenter.sharedシングルトンであり、アプリ全体が同じインスタンスを使用します.individualこのパラメータは個人認証モードを指定します。これは、.childペアレンタルコントロールモード- 使用
async/await非同期認可フローを処理する - 初めて呼び出すと、システム アラートがポップアップ表示されます。ユーザーが [許可] をクリックした後、Face ID/Touch ID/パスワードの検証が必要になります。
- 認証が成功した後、再度呼び出すとサイレントに成功し、繰り返しポップアップは表示されません。
認証が完了すると、設定に 2 つの新しいスイッチが追加されます。
- [設定] > [スクリーンタイム] > [スクリーンタイム] にアクセスできるアプリ
- 設定 > [アプリ名] > 使用時間制限
ユーザーは、両方の場所でいつでも認証を取り消すことができます。
名前付きストアを使用してさまざまなシナリオを管理する
(05:13)
デバイス アクティビティ モニター拡張機能の応答時間ウィンドウ:
import DeviceActivity
import ManagedSettings
class WorklogMonitor: DeviceActivityMonitor {
let database = BarkDatabase()
override func intervalDidStart(for activity: DeviceActivityName) {
super.intervalDidStart(for: activity)
let socialStore = ManagedSettingsStore(named: .social)
socialStore.clearAllSettings()
}
override func intervalDidEnd(for activity: DeviceActivityName) {
super.intervalDidEnd(for: activity)
let socialStore = ManagedSettingsStore(named: .social)
let socialCategory = database.socialCategoryToken
socialStore.shield.applicationCategories = .specific([socialCategory])
socialStore.shield.webDomainCategories = .specific([socialCategory])
}
}
キーポイント:
ManagedSettingsStore(named: .social)socialという名前のストアを作成/アクセスしますclearAllSettings()ワンクリックでストア上のすべての制限をクリアしますshield.applicationCategories特定のアプリカテゴリをブロックするshield.webDomainCategories特定の Web サイト カテゴリをブロックするintervalDidStart時間枠の開始時に呼び出されます (例: 午後 5 時にソーシャル アプリを開く)intervalDidEnd時間枠の終わりに呼び出されます (例: 午後 8 時に再ブロック)
カスタム使用状況レポートを作成する
(07:02)
メイン アプリでレポート コンテキストとフィルターを定義します。
import SwiftUI
import DeviceActivity
extension DeviceActivityReport.Context {
static let pieChart = Self("Pie Chart")
}
@main
struct Worklog: App {
private let thisWeek = DateInterval(...)
@State private var context: DeviceActivityReport.Context = .pieChart
@State private var filter = DeviceActivityFilter(
segment: .daily(during: thisWeek)
)
var body: some Scene {
WindowGroup {
GeometryReader { geometry in
VStack(alignment: .leading) {
DeviceActivityReport(context: context, filter: filter)
.frame(height: geometry.size.height * 0.75)
}
}
}
}
}
キーポイント:
DeviceActivityReport.Contextレポートタイプ識別子の定義DeviceActivityFilterデータ時間範囲の指定、サポート.daily、.weekly均等分割DeviceActivityReportこれはインターフェイスに直接埋め込まれた SwiftUI ビューです。
レポート拡張機能のデータを処理します。
import SwiftUI
import DeviceActivity
struct PieChartReport: DeviceActivityReportScene {
let context: DeviceActivityReport.Context = .pieChart
let content: (PieChartView.Configuration) -> PieChartView
func makeConfiguration(representing data: [DeviceActivityData])
-> PieChartView.Configuration {
var totalUsageByCategory: [ActivityCategory: TimeInterval]
totalUsageByCategory = data.map(…)
return PieChartView.Configuration(
totalUsageByCategory: totalUsageByCategory
)
}
}
キーポイント:
DeviceActivityReportSceneレポート拡張のプロトコルですmakeConfigurationデータが更新されると自動的に呼び出され、手動でトリガーする必要はありません- 返された構成はビューモデルとして SwiftUI ビューに渡されます
拡張子のエントリ:
import SwiftUI
import DeviceActivity
@main
struct WorklogReportExtension: DeviceActivityReportExtension {
var body: some DeviceActivityReportScene {
PieChartReport { configuration in
PieChartView(configuration: configuration)
}
}
}
重要ポイント
-
やるべきこと: パーソナル フォーカス アシスタントを構築し、時間帯に応じて気が散るアプリを自動的にブロックします
-
実行する価値がある理由: iOS 16 の個人認証モードにより、このようなツールは家族共有関係を必要としなくなり、対象ユーザーが親からすべての iPhone ユーザーに拡大されました。
-
開始方法: を使用します
AuthorizationCenter.shared.requestAuthorization(for: .individual)認可を取得して作成するManagedSettingsStoreブロック ルールを設定するには、次を使用します。DeviceActivitySchedule時間枠を定義する -
内容: 企業が仕事用デバイスの使用状況を監視できるようにする、チームの画面時間管理ツールを開発します。
-
価値がある理由: Apple Business Essentials と Screen Time API はエンタープライズレベルのデバイス使用戦略を実装できます
-
開始方法: 管理対象 Apple ID とデバイス アクティビティ レポートを組み合わせて、チームの使用状況レポートを生成します
-
やるべきこと: 強制的な制限を達成システムに置き換えて、子供向けのデジタル習慣構築ゲームを作成します。
-
実行する価値がある理由: 従来のペアレンタルコントロールは対立を引き起こしやすいため、ゲーミフィケーションの方が受け入れられやすいです。
-
開始方法: デバイス アクティビティ レポートを使用して使用状況データを表示し、Game Center 実績システムと組み合わせて、基準に達した後に制限を自動的に緩和します。
-
やるべきこと: Web サイト/アプリを構築し、ユーザーが自分の時間配分を理解できるように分析ツールを使用します。
-
実行する価値がある理由: カスタム レポート拡張機能は SwiftUI を使用して美しいデータ視覚化を描画できます。
-
開始方法: DeviceActivityReportExtension を作成します。
makeConfiguration中程度の重合DeviceActivityData、Swift Chartsまたはカスタムビューでレンダリングされます。
関連セッション
- Apple デバイス管理の最新情報 — Apple デバイス管理の最新アップデート
- Swift の新機能 — Swift 言語の新機能
- Add Shared with You to your app — Shared with you helps people easily find content in your app
コメント
GitHub Issues · utterances