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

おっと、お飲みごろの時間です!

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.

 おっと、お飲みごろの時間です!

Avatar for Shigure Shimotori

Shigure Shimotori

July 06, 2025
Tweet

More Decks by Shigure Shimotori

Other Decks in Programming

Transcript

  1. (1/8) NSAlarmKitUsageDescriptionͰڐՄऔΔ • ͍ͭ΋ͷΑ͏ʹΞϨΛιϨ͢Ε͹OK • Info.plist΁ͷهࡌ • NSAlarmKitUsageDescription • ϦΫΤετ

    • try await AlarmManager.shared.requestAuthorization() https://developer.apple.com/documentation/BundleResources/Information-Property-List/NSAlarmKitUsageDescription
 https://developer.apple.com/documentation/alarmkit/alarmmanager/requestauthorization()
  2. (2/8) ՔಇதͷΞϥʔϜͷϦετΛ࡞Δʢਪ঑ʣ • ҰཡͱετοϓϘλϯΛઌʹ࡞ΔɻΞϓϦΛΩϧͯ͠΋ফ͑ͯ͘Εͳ͍͔Β… • ࢖͑ͦ͏ͳ΋ͷ • AlarmManager.shared.alarms • AlarmManager.shared.alarmUpdates

    • AlarmManager.shared.stop(id:) https://developer.apple.com/documentation/alarmkit/alarmmanager/alarms
 https://developer.apple.com/documentation/alarmkit/alarmmanager/alarmupdates-swift.property
 https://developer.apple.com/documentation/alarmkit/alarmmanager/stop(id:) : Array : AsyncSequence
  3. (3/8) ΞϥʔϜىಈͷͨΊͷઃఆΛ૊ΈཱͯΔ • ΞϥʔϜ = ܾ·ͬͨεέδϡʔϧͰ௨஌ͯ͘͠ΕΔ΋ͷ • ࣝผ͸ UUID •

    ঢ়ଶ͸ Alarm.State • .countdown / .scheduled • .paused • .alerting https://developer.apple.com/documentation/alarmkit/alarm/id-swift.property
 https://developer.apple.com/documentation/alarmkit/alarm/state-swift.enum
  4. (3/8) ΞϥʔϜىಈͷͨΊͷઃఆΛ૊ΈཱͯΔ • ΞϥʔϜ͝ͱͷ৘ใͷೖΕ෺Λ࡞Δʢඞਢʣ • ۭͰ΋͍͍͔Β༻ҙ͠ɺ protocol AlarmMetadata ʹ४ڌͤ͞Δ •

    WWDCಈըͷΩονϯλΠϚʔͰ͸ frying / grilling ΛೖΕ͍ͯͨ ༲͛ͯΔͷ͔ম͍ͯΔͷ͔ https://developer.apple.com/documentation/alarmkit/alarmmetadata
  5. ίϯύΠϧ͕௨Βͳ͍ΜͰ͚͢ͲΥʂʁ • ΋͔ͯ͠͠ɿSE-0466 Control default actor isolation inference nonisolated struct

    TeaBrewData: AlarmMetadata { } https://github.com/swiftlang/swift-evolution/blob/main/proposals/0466-control-default-actor-isolation.md
 https://developer.apple.com/videos/play/wwdc2025/245/
 https://developer.apple.com/videos/play/wwdc2025/268/
 https://developer.apple.com/videos/play/wwdc2025/270/ ΋͘͠͸ Λมߋ
  6. (3/8) ΞϥʔϜىಈͷͨΊͷઃఆΛ૊ΈཱͯΔ let alert = AlarmPresentation.Alert( title: , stopButton: ,

    secondaryButton: , secondaryButtonBehavior: ) let alarmAttributes = AlarmAttributes( presentation: AlarmPresentation(alert: alert), metadata: TeaBrewData( ), tintColor: ) λΠτϧ ετοϓϘλϯͷઃఆ 2ͭ໨ͷϘλϯͷઃఆ .countdownʹ͢ΔͱϦϐʔτϘλϯʹͳΔ 2ͭ໨ͷϘλϯͷഎܠ৭΋͜ΕʹͳΔ ޷͖ͳ΋ͷΛೖΕΑ͏ʂ https://developer.apple.com/documentation/alarmkit/alarmpresentation/alert-swift.struct
 https://developer.apple.com/documentation/alarmkit/alarmbutton
 https://developer.apple.com/documentation/alarmkit/alarmpresentation/alert-swift.struct/secondarybuttonbehavior-swift.enum
  7. (3/8) ΞϥʔϜىಈͷͨΊͷઃఆΛ૊ΈཱͯΔ let countdownDuration = Alarm.CountdownDuration( preAlert: , postAlert: ...,

    ) let configuration = AlarmManager.AlarmConfiguration( countdownDuration: countdownDuration, attributes: attributes ) try await AlarmManager.shared.schedule( id: UUID(), configuration: configuration ) Ξϥʔτ͕໐Δ·Ͱͷඵ਺ https://developer.apple.com/documentation/alarmkit/alarm/countdownduration-swift.struct
 https://developer.apple.com/documentation/alarmkit/alarmmanager/alarmcon fi guration
 https://developer.apple.com/documentation/alarmkit/alarmmanager/schedule(id:con fi guration:) Ξϥʔτ͕໐Δ·Ͱͷ࣌ؒʢεψʔζ࣌ʣ
  8. (4/8) Live ActivityΛ࢓ཱͯΔ • ҰൠతͳExtension΍ActivityKit΍AppIntentsͷ࿩ʹͳΔͷͰলུ • ͍ͭ΋ͱҧ͏ϙΠϯτ • attributesType ͸

    AlarmAttributes< >.self • AlarmKit͕ҰॹʹࣗಈͰactivity΋ϦΫΤετͯ͘͠ΕΔ • खಈͰͷϦΫΤετෆཁɺNSSupportsLiveActivitiesෆཁ • զʑ͸UIͱλοϓ࣌ͷॲཧ͚࣮ͩ૷͢Ε͹OK AlarmMetadataʹ४ڌͤͨ͞ΞϨ
  9. (5/8) ΞϥʔϜͷ࢒Γ࣌ؒͷܭࢉ • Live Activity༻ʹܭࢉ&ද͍ࣔͨ͠৔߹ • AlarmPresentationState.Mode ͔Βඞཁͳ৘ใΛऔΕΔ • timerInterval:countsDown:

    Λड͚औͬͯ͘ΕΔUIΛ࢖͏ͱָ https://developer.apple.com/documentation/alarmkit/alarmpresentationstate/mode-swift.enum
 https://developer.apple.com/documentation/swiftui/progressview/init(timerinterval:countsdown:)
 https://developer.apple.com/documentation/swiftui/text/init(timerinterval:pausetime:countsdown:showshours:) ActivityConfiguration( for: AlarmAttributes< >.self ) { context in switch context.state.mode { case let .countdown(countdownMode): AlarmMetadataʹ४ڌͤͨ͞ΞϨ ↑
 ͜Εʂ
  10. (5/8) ΞϥʔϜͷ࢒Γ࣌ؒͷܭࢉ • Χ΢ϯτμ΢ϯத startDate previouslyElapsedDuration Date.now totalCountdownDuration Ծ૝ͷ
 Χ΢ϯτμ΢ϯ


    ։࢝࣌ࠁ Ξϥʔτ
 ൃՐ࣌ࠁ
 ʢ༧ఆʣ ͜͜ͷClosedRange<Date>Λ౉͢ ࣮ࡍʹΧ΢ϯτμ΢ϯͯ͠Δظؒ ࣌ࠁ
  11. (5/8) ΞϥʔϜͷ࢒Γ࣌ؒͷܭࢉ • ϙʔζத • Ҋ1: ProgressView(value:)Λ࢖͏ • Ҋ2: Durationͷformatted()Ͱ͍͍ײ͡ͷStringΛ࡞ͬͯ΋Β͏

    • Ҋ3: Ҿ͖ଓ͖Text(timerInterval:pauseTime:...)Λ࢖͏ • pauseTimeʹద౰ͳDateΛೖΕ͓ͯ͘ͱࢭ·Γ·͢
  12. (5/8) ΞϥʔϜͷ࢒Γ࣌ؒͷܭࢉ • Text(timerInterval:pauseTime:...)Ͱϙʔζ͢Δ৔߹ previouslyElapsedDuration totalCountdownDuration Ծ૝ͷ
 Χ΢ϯτμ΢ϯ
 ։࢝࣌ࠁ Ծ૝ͷ


    Χ΢ϯτμ΢ϯ
 ऴྃ࣌ࠁ Ծ૝ͷΧ΢ϯτμ΢ϯ։࢝࣌ࠁΛT = now - previouslyElapsedDurationͱͨ͠ͱ͖ timerInterval: T … T + totalCountdownDuration, pauseTime: T + totalCountdownDuration - previouslyElapsedDuration Λ༩͓͚͑ͯ͹Χ΢ϯτμ΢ϯ͸ࢭ·Δɻ
 ΊΜͲ͚Ε͹TΛUNIXΤϙοΫͱ͔ͷେੲͰ୅༻͢Ε͹େৎ෉͍͚Δ͍͚Δʢࡶʣ ࣌ࠁ 👆Date.now͕͜͜ΑΓະདྷΛࢦ͢ͱΧ΢ϯτμ΢ϯ͸ఀࢭ͢ΔʢΑ͏ʹ͍ͨ͠ʣ 👆ϙʔζ࣌ʹText͕දࣔ͢Δ࣌ؒɺͭ·Γ࢒Γ࣌ؒΛ଍͢