2022 App ServicesBusiness & EducationEssentialsSystem Services
WWDC22 · 10 min · App Services / Business & Education / Essentials / System Services
What’s new in Screen Time API
Find out how you can build apps that help people manage their relationship with their device — all while putting privacy first. We’ll take you through the Screen Time API and share how you can use features like core restrictions and device activity reports to create great experiences while providing measurable control for the device’s owner, parents, and guardians.
Watch at developer.apple.com ↗Code shown on screen · 6 snippets
Request aAhuthorization
// APP: Request Authorization
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 Aniyah with error: \(error)")
}
}
}
}
} Managed settings store
// MONITOR EXTENSION: Handle Social category at start/end of interval
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])
}
} Device activity report and filter
// APP: Top-level view
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)
}
} Device activity report
// REPORT EXTENSION: Configure Custom Device Activity Report
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)
}
} Configure Custom Device Activity Report
// REPORT EXTENSION: Configure Custom Device Activity Report
import SwiftUI
import DeviceActivity
struct PieChartView: View {
struct Configuration {
let totalUsageByCategory: [ActivityCategory:TimeInterval]
}
let configuration: Configuration
var body: some View {
// A complex view that renders a bar graph based on Aniyah’s usage per category.
PieChart(usage: configuration.totalUsageByCategory)
}
} Present custom report
// REPORT EXTENSION: Draw Custom Device Activity Report
import SwiftUI
import DeviceActivity
@main
struct WorklogReportExtension: DeviceActivityReportExtension {
var body: some DeviceActivityReportScene {
PieChartReport { configuration in
PieChartView(configuration: configuration)
}
}
}