Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Screen Time APIで 生活習慣改善アプリを作ってみた!

Screen Time APIで 生活習慣改善アプリを作ってみた!

iOSDC Japan 2024 Day1 TrackA ルーキーズLTで発表
https://fortee.jp/iosdc-japan-2024/proposal/16c540f9-d233-4881-8907-9bf018a6cc96

Avatar for Yuto Tomita

Yuto Tomita

August 23, 2024
Tweet

Other Decks in Technology

Transcript

  1. 88%$ w 04 w J04J1BE04.BD04.POUFSFZ8BUDI04 w 9DPEF$MPVE w 4IBSF1MBZ w

    ۭؒΦʔσΟΦ w Ϣχόʔαϧίϯτϩʔϧ w 4DSFFO5JNF"1* ͳͲͳͲ
  2. 88%$ w 04 w J04J1BE04.BD04.POUFSFZ8BUDI04 w 9DPEF$MPVE w 4IBSF1MBZ w

    ۭؒΦʔσΟΦ w Ϣχόʔαϧίϯτϩʔϧ w 4DSFFO5JNF"1* ͳͲͳͲ
  3. #VOEMF*%ͷऔಘ // લུ var body: some View { mainView .familyActivityPicker(

    isPresented: $isPresented, selection: $selection ) }
  4. #VOEMF*%ͷऔಘ // લུ var body: some View { mainView .familyActivityPicker(

    isPresented: $isPresented, selection: $selection ) }
  5. γʔϧυը໘ΛΧελϚΠζ import ManagedSettings import ManagedSettingsUI import UIKit class ShieldConfigurationExtension: ShieldConfigurationDataSource

    { override func configuration(shielding application: Application) -> ShieldConfiguration { ShieldConfiguration( icon: UIImage(named: "icon")!, title: .init(text: "Title", color: .white), subtitle: .init(text: "Subtitle", color: .white), primaryButtonLabel: .init(text: "Dismiss", color: .black), primaryButtonBackgroundColor: .blue, secondaryButtonLabel: .init(text: "Unlock", color: .red) ) } }
  6. γʔϧυը໘ΛΧελϚΠζ import ManagedSettings import ManagedSettingsUI import UIKit class ShieldConfigurationExtension: ShieldConfigurationDataSource

    { override func configuration(shielding application: Application) -> ShieldConfiguration { ShieldConfiguration( icon: UIImage(named: "icon")!, title: .init(text: "Title", color: .white), subtitle: .init(text: "Subtitle", color: .white), primaryButtonLabel: .init(text: "Dismiss", color: .black), primaryButtonBackgroundColor: .blue, secondaryButtonLabel: .init(text: "Unlock", color: .red) ) } }
  7. ଞΞϓϦͷ࢖༻ঢ়گͷऔಘ extension DeviceActivityReport.Context { static let totalActivity = Self("Total Activity")

    } struct TotalActivityReport: DeviceActivityReportScene { let context: DeviceActivityReport.Context = .totalActivity let content: (String) -> TotalActivityView func makeConfiguration(representing data: DeviceActivityResults<DeviceActivityData>) async -> String { let formatter = DateComponentsFormatter() formatter.allowedUnits = [.day, .hour, .minute, .second] formatter.unitsStyle = .abbreviated formatter.zeroFormattingBehavior = .dropAll let totalActivityDuration = await data.flatMap { $0.activitySegments }.reduce(0, { $0 + $1.totalActivityDuration }) return formatter.string(from: totalActivityDuration) ?? "No activity data" } } struct TotalActivityView: View { let totalActivity: String var body: some View { Text(totalActivity) } }
  8. ଞΞϓϦͷ࢖༻ঢ়گͷऔಘ extension DeviceActivityReport.Context { static let totalActivity = Self("Total Activity")

    } struct TotalActivityReport: DeviceActivityReportScene { let context: DeviceActivityReport.Context = .totalActivity let content: (String) -> TotalActivityView func makeConfiguration(representing data: DeviceActivityResults<DeviceActivityData>) async -> String { let formatter = DateComponentsFormatter() formatter.allowedUnits = [.day, .hour, .minute, .second] formatter.unitsStyle = .abbreviated formatter.zeroFormattingBehavior = .dropAll let totalActivityDuration = await data.flatMap { $0.activitySegments }.reduce(0, { $0 + $1.totalActivityDuration }) return formatter.string(from: totalActivityDuration) ?? "No activity data" } } struct TotalActivityView: View { let totalActivity: String var body: some View { Text(totalActivity) } }