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

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

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

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͕දࣔ͢Δ࣌ؒɺͭ·Γ࢒Γ࣌ؒΛ଍͢