Slide 1

Slide 1 text

AlarmKitͰ࣮ݱ͢Δ ৽࣌୅ͷγεςϜ௨஌ ᠃ڮྋ@tsuzuki817 ʙ 5SBDL%ϨΪϡϥʔτʔΫʢ෼ʣ J04%$+BQBO

Slide 2

Slide 2 text

ࣗݾ঺հ ᠃ڮྋ !UTV[VLJ ʮࢥ͍ग़ͱςΫϊϩδʔͰ৽͍͠ମݧΛ૑଄͢Δʯ ݸਓ։ൃؤுͬͯΔ ୅ද࡞඼ ཱྀߦࢥ͍ग़Ϛοϓ ݅ ߴධ ສ%-ཱྀͷࢥ͍ग़Λ஍ਤʹه࿥͢ΔΞϓϦ ྲྀΕΔϝϞா ສ%- ϝσΟΞ঺հଟ਺৽ײ֮ͷϝϞΞϓϦ ͍ͭͰ΋λΠϚʔ ਆΞϓϦड৆ -JWF"DUJWJUZରԠͷλΠϚʔΞϓϦ גࣜձࣾ;0;0 ;0;0508/J04։ൃ ྺ࢙͋Δେن໛ΞϓϦΛҰॹʹΑ͍ͯ͘͘͠஥ؒืूத ͜Ε·ͰݸਓͰϦϦʔεͨ͠ΞϓϦ͸ݸ

Slide 3

Slide 3 text

ຊ೔͓఻͑͢Δ͜ͱ 1.ংষ - طଘͷ՝୊ 2.AlarmKitͷ֩৺ػೳ 3.࣮૷ΨΠυ 4.࣮ફσϞͱϕετϓϥΫςΟε 5.·ͱΊͱల๬

Slide 4

Slide 4 text

ংষɹطଘͷ՝୊

Slide 5

Slide 5 text

͋Δ೔͋ͳͨ͸ΞϓϦʹ ϩʔΧϧϓογϡ௨஌ػೳΛೖΕ·ͨ͠

Slide 6

Slide 6 text

खݩͰͷಈ࡞֬ೝ΋Ͱ͖ͯ ΞϓϦ΋ແࣄϦϦʔε

Slide 7

Slide 7 text

Ұ҆৺😌

Slide 8

Slide 8 text

ͱ͜Ζ͕

Slide 9

Slide 9 text

௨஌͕ಧ͔ͳ͍Μ͚ͩͲ Ͳ͏ʹ͔ͯ͠ʂ

Slide 10

Slide 10 text

🧐

Slide 11

Slide 11 text

։ൃऀͷ௕೥ͷ೰Έ αΠϨϯτϞʔυ/ϑΥʔΧεϞʔυ σόΠεઃఆ΁ͷґଘੑ ॏཁͳΞϥʔϜͳͷʹσόΠεઃఆͷͨΊ Ϣʔβʔʹಧ͔ͳ͍ͱ͍͏δϨϯϚ 3 λΠϚʔऴྃ ྉཧΛऔΓग़͍ͯͩ͘͠͞ ձٞϦϚΠϯμʔ ෼ޙʹ։࢝͠·͢ ༧ఆͷ͓஌Βͤ ໌೔ͷଧͪ߹Θͤ 👷

Slide 12

Slide 12 text

७ਖ਼ΞϓϦͩͬͨΒ Ͱ͖Δͷʹʜ

Slide 13

Slide 13 text

"QQMF͹͔ͬΓͣΔ͍Ͷ

Slide 14

Slide 14 text

ͱɺࢥͬͯͨΒ

Slide 15

Slide 15 text

88%$Ͱ·͔͞ͷʜ

Slide 16

Slide 16 text

AlarmKitొ৔

Slide 17

Slide 17 text

AlarmKitొ৔ J04ͷֵ໋ ৽࣌୅ͷγεςϜ௨஌ϑϨʔϜϫʔΫ iOS 26 / iPadOS 26ରԠ Silent Mode / Focus Modeಥഁ ॏཁͳ௨஌Λ࣮֬ʹϢʔβʔʹಧ͚Δ ΧελϜΞϥʔϜͱλΠϚʔ ΧελϚΠζՄೳͳεέδϡʔϧͱ6* ճݶΓɺ܁Γฦ͠ɺΧ΢ϯτμ΢ϯɺεψʔζػೳ ֵ໋తͳΞϥʔϜػೳ λΠϚʔ ఆظΞϥʔϜ εψʔζ

Slide 18

Slide 18 text

γεςϜઃఆʹࠨӈ͞Εͳ͍ ࣮֬ͳΞϥʔϜ௨஌Λ࣮ݱ͢Δ৽"1*

Slide 19

Slide 19 text

02.AlarmKitͷ֩৺ػೳ

Slide 20

Slide 20 text

ֵ৽తػೳ 4ͭͷओཁػೳ γεςϜઃఆಥഁ Silent Mode/Focus ModeͷӨڹΛ ड͚ͳ͍࣮֬ͳ௨஌ γεςϜઃఆʹؔΘΒͣ௨஌Λಧ͚Δ

Slide 21

Slide 21 text

ֵ৽తػೳ 4ͭͷओཁػೳ Live Activities࿈ܞ Dynamic IslandϩοΫը໘Ͱͷࢹ ֮తͳΞϥʔϜදࣔ ϦΞϧλΠϜͷΧ΢ϯτμ΢ϯදࣔ

Slide 22

Slide 22 text

ֵ৽తػೳ 4ͭͷओཁػೳ Apple Watchಉظ σόΠεΛ໰Θͳ͍Ұ؏ͨ͠ΞϥʔϜػೳ iPhoneͱࣗಈతʹಉظ͞ΕΔ௨஌

Slide 23

Slide 23 text

ֵ৽తػೳ 4ͭͷओཁػೳ App Intents ΞϥʔϜޙͷΧελϜΞΫγϣϯ ಠࣗͷϫʔΫϑϩʔΛ૊ΈࠐΈՄೳ

Slide 24

Slide 24 text

͜ΕͰ ࠷ڧͷΞϥʔϜ͕࡞ΕΔʂ

Slide 25

Slide 25 text

࣮૷ΨΠυ

Slide 26

Slide 26 text

·ͣ࠷ॳʹશମ૾Λ೺Ѳ

Slide 27

Slide 27 text

γεςϜΞʔΩςΫνϟ AlarmKitͷओཁίϯϙʔωϯτ Core AlarmKitϑϨʔϜϫʔΫ AlarmManager ΞϥʔϜͷεέδϡʔϧɺεψʔζɺΩϟϯηϧͳͲ؅ཧ Alarm ΞϥʔϜͷఆٛʢεέδϡʔϧɺঢ়ଶͳͲʣ UI Live Activities (ActivityKit) Widget Extension Χ΢ϯτμ΢ϯදࣔʹར༻ Actions App Intents ΧελϜΞΫγϣϯ࣮ߦ

Slide 28

Slide 28 text

࣮૷લʹ΍Δ͜ͱ

Slide 29

Slide 29 text

ڐՄϑϩʔ Ϣʔβʔೝূͷ࣮૷ Ϣʔβʔͷಉҙ Info.plistʹ௥Ճ NSAlarmKitUsageDescription NSAlarmKitUsageDescription ʢྫʣྉཧ׬ྃΛ࣮֬ʹ͓஌Βͤ͢ΔͨΊʹɺΞϥʔϜ΁ͷΞΫηε͕ඞཁͰ͢

Slide 30

Slide 30 text

ڐՄϑϩʔ Ϣʔβʔೝূͷ࣮૷ ڐՄϦΫΤετͷλΠϛϯά खಈͰϦΫΤετ͢Δํ๏ AlarmManager.shared.requestAuthorization() ॳճΞϥʔϜ࡞੒࣌ࣗಈతʹݺ͹ΕΔ

Slide 31

Slide 31 text

ڐՄϑϩʔ Ϣʔβʔೝূͷ࣮૷ ೝূঢ়ଶͷ֬ೝ AlarmManager.shared.authorizationState .notDetermined ະબ୒ Ϣʔβʔʹ·ͩڐՄΛٻΊ͍ͯͳ͍ঢ়ଶ .authorized ڐՄࡁ ΞϥʔϜΛεέδϡʔϧ͢ΔڐՄ͕༩͑ΒΕͨঢ়ଶ .denied ڋ൱ Ϣʔβʔ͕ΞϥʔϜͷڐՄΛ໌ࣔతʹڋ൱ͨ͠ঢ়ଶ ڋ൱͞Εͨ৔߹͸6*Ͱ໌ࣔ͠ɺ ઃఆΞϓϦ͔ΒݖݶΛมߋ͢Δํ๏ΛҊ಺

Slide 32

Slide 32 text

ΞϥʔϜͷ࣮૷

Slide 33

Slide 33 text

γϯϓϧͳΞϥʔϜ࣮૷ γϯϓϧͳΞϥʔϜͷεέδϡʔϧ UIଐੑΛఆٛ Alert: ΞϥʔτͷλΠτϧ AlarmButton: ϘλϯͷςΩετ ৭ ΞΠίϯ tintColor: ΞϥʔϜ6*ͷςʔϚΧϥʔ

Slide 34

Slide 34 text

γϯϓϧͳΞϥʔϜ࣮૷ γϯϓϧͳΞϥʔϜͷεέδϡʔϧ εέδϡʔϧΛఆٛ fixed ઈରతͳ೔࣌ࢦఆ λΠϜκʔϯมߋͷӨڹͳ͠  relative ࣌ࠁͱ܁Γฦ͠ύλʔϯ λΠϜκʔϯมߋΛߟྀ ઃఆͱεέδϡʔϧ AlarmConfiguration࡞੒ AlarmManager.shared.schedule()࣮ߦ

Slide 35

Slide 35 text

/ / UIଐੑͷఆٛ let stopButton = AlarmButton( text: "͓͸Α͏", textColor: Color.blue, systemImageName: "checkmark.circle" ) let alertPresentation = AlarmPresentation.Alert( title: "ࠓ೔͸iOSDCʂى͖ͳ͍ͱ஗ࠁ͢Δͧʂʂʂ", stopButton: stopButton ) / / ͦΕҎ֎ͷݟͨ໨ͷ࡞੒ let attributes = AlarmAttributes( presentation: AlarmPresentation(alert: alertPresentation), metadata: SampleAlarmMetadata(), tintColor: Color.orange ) / / εέδϡʔϧͷఆٛɹྫ: ݻఆ೔࣌ͷΞϥʔϜ let schedule = Alarm.Schedule.fixed(Date().addingTimeInterval(3)) let alarmConfiguration = AlarmManager.AlarmConfiguration .alarm( schedule: schedule, attributes: attributes ) / / εέδϡʔϧ࣮ߦ _ = try? await AlarmManager.shared.schedule(id: UUID(), configuration: alarmConfiguration) γϯϓϧͳΞϥʔϜ࣮૷ ΞϥʔϜϑϩʔ ΞϥʔϜఆٛ γεςϜ΁ొ࿥ εέδϡʔϧ࣮ߦ Ξϥʔτදࣔ

Slide 36

Slide 36 text

ҙ֎ͱଟ͍

Slide 37

Slide 37 text

// UIଐੑͷఆٛ let stopButton = AlarmButton( text: "͓͸Α͏", textColor: Color.blue, systemImageName: "checkmark.circle" ) let alertPresentation = AlarmPresentation.Alert( title: "ࠓ೔͸iOSDCʂى͖ͳ͍ͱ஗ࠁ͢Δͧʂʂʂ", stopButton: stopButton ) γϯϓϧͳΞϥʔϜ࣮૷

Slide 38

Slide 38 text

// ͦΕҎ֎ͷݟͨ໨ͷ࡞੒ let attributes = AlarmAttributes( presentation: AlarmPresentation(alert: alertPresentation), metadata: SampleAlarmMetadata(), tintColor: Color.orange ) γϯϓϧͳΞϥʔϜ࣮૷

Slide 39

Slide 39 text

// εέδϡʔϧͷఆٛɹྫ: ݻఆ೔࣌ͷΞϥʔϜ let schedule = Alarm.Schedule.fixed(Date().addingTimeInterval(10)) let alarmConfiguration = AlarmManager.AlarmConfiguration .alarm( schedule: schedule, attributes: attributes ) γϯϓϧͳΞϥʔϜ࣮૷

Slide 40

Slide 40 text

// εέδϡʔϧ࣮ߦ _ = try? await AlarmManager.shared.schedule( id: UUID(), configuration: alarmConfiguration ) γϯϓϧͳΞϥʔϜ࣮૷

Slide 41

Slide 41 text

ܰ͘·ͱΊΔͱʜ

Slide 42

Slide 42 text

AlarmConfiguration Alarm.Schedule AlarmAttributes AlarmPresentation AlarmButton title AlarmMetadata

Slide 43

Slide 43 text

͜ΕͰΞϥʔϜઃஔ͠์୊Ͱ͢ʂ

Slide 44

Slide 44 text

࣍͸Χ΢ϯτμ΢ϯ࣮૷

Slide 45

Slide 45 text

Χ΢ϯτμ΢ϯ࣮૷ ͱεψʔζ λΠϚʔػೳ ఆٛ Χ΢ϯτμ΢ϯظؒΛఆٛ Alarm.CountdownDuration preAlert: ॳճΞϥʔτ·Ͱͷ࣌ؒ postAlert: εψʔζ࣌ؒ UI Χ΢ϯτμ΢ϯҰ࣌ఀࢭ6*Λఆٛ AlarmPresentation.Countdown Χ΢ϯτμ΢ϯதͷλΠτϧɺҰ࣌ఀࢭϘλϯ ಈ࡞ ηΧϯμϦϘλϯͷಈ࡞ઃఆ secondaryButtonBehavior: .countdown -> εψʔζ΍λΠϚʔ܁Γฦ͠ΛτϦΨʔ -> postAlert

Slide 46

Slide 46 text

Χ΢ϯτμ΢ϯ࣮૷ ͱεψʔζ λΠϚʔػೳ λΠϚʔঢ়ଶͷྲྀΕ ηΧϯμϦϘλϯΛDPVOUEPXOʹઃఆ͢Δͱɺεψʔζ·ͨ͸ ܁Γฦ͕͠Մೳʹ QPTU"MFSU͸εψʔζϘλϯ͕ԡ͞Εͨ࣌ͷΈ࢖༻͞ΕΔ Χ΢ϯτμ΢ϯ preAlert Ξϥʔτ ௨஌දࣔ εψʔζ postAlert

Slide 47

Slide 47 text

Χ΢ϯτμ΢ϯ࣮૷ λΠϚʔػೳͱεψʔζ let alertContent = AlarmPresentation.Alert( title: "AlarmKitΛ఻͑Δొஃ࣌ؒ", stopButton: .stopButton, secondaryButton: .repeatButton, secondaryButtonBehavior: .countdown ) let countdownContent = AlarmPresentation.Countdown(title: "ۓுͷొஃ", pauseButton: .init(text: "ఀࢭ", textColor: .orange, systemImageName: "pause")) let pausedContent = AlarmPresentation.Paused(title: "ۓு࠶։", resumeButton: .init(text: "࠶։", textColor: .blue, systemImageName: "play.fill")) let attributes = AlarmAttributes( presentation: AlarmPresentation( alert: alertContent, countdown: countdownContent, paused: pausedContent ), metadata: CookingData(method: .fry), tintColor: .orange ) let id = UUID() let alarmConfiguration = AlarmConfiguration( countdownDuration: .init(preAlert: 15 * 60, postAlert: 5 * 60), attributes: attributes, secondaryIntent: RepeatIntent(alarmID: id.uuidString) )

Slide 48

Slide 48 text

૬มΘΒͣίʔυྔ͕ଟ͍

Slide 49

Slide 49 text

ͷͰ

Slide 50

Slide 50 text

ҰͭҰͭݟ͍͖ͯ·͠ΐ͏

Slide 51

Slide 51 text

Χ΢ϯτμ΢ϯ࣮૷ ·ͣΞϥʔτը໘ let alertContent = AlarmPresentation.Alert( title: “AlarmKitΛ࢖ͬͯΈΔ", stopButton: .stopButton, secondaryButton: .repeatButton, secondaryButtonBehavior: .countdown ) SecondaryButtonBehavior .countdown .custom→ࣗ༝ͳΞΫγϣϯ͕ઃఆͰ͖Δ

Slide 52

Slide 52 text

Χ΢ϯτμ΢ϯ࣮૷ ·ͣΞϥʔτը໘ extension AlarmButton { static var repeatButton: Self { AlarmButton( text: "Repeat", textColor: .black, systemImageName: "repeat.circle" ) } }

Slide 53

Slide 53 text

Χ΢ϯτμ΢ϯ࣮૷ λΠϚʔػೳͱεψʔζ let countdownContent = AlarmPresentation.Countdown( title: “ۓுͷొஃ", pauseButton: .init( text: “ఀࢭ", textColor: .orange, systemImageName: “pause" ) )

Slide 54

Slide 54 text

Χ΢ϯτμ΢ϯ࣮૷ λΠϚʔػೳͱεψʔζ let pausedContent = AlarmPresentation.Paused( title: “ۓு࠶։", resumeButton: .init( text: “࠶։", textColor: .blue, systemImageName: “play.fill" ) )

Slide 55

Slide 55 text

Χ΢ϯτμ΢ϯ࣮૷ λΠϚʔػೳͱεψʔζ let attributes = AlarmAttributes( presentation: AlarmPresentation( alert: alertContent, countdown: countdownContent, paused: pausedContent ), metadata: CookingData(method: .fry), tintColor: .orange )

Slide 56

Slide 56 text

Χ΢ϯτμ΢ϯ࣮૷ λΠϚʔػೳͱεψʔζ let id = UUID() let alarmConfiguration = AlarmConfiguration( countdownDuration: .init(preAlert: 15 * 60, postAlert: 5 * 60), attributes: attributes, secondaryIntent: RepeatIntent(alarmID: id.uuidString) ) try await AlarmManager.shared.schedule( id: id, configuration: alarmConfiguration )

Slide 57

Slide 57 text

Χ΢ϯτμ΢ϯ࣮૷ λΠϚʔػೳͱεψʔζ struct RepeatIntent: LiveActivityIntent { func perform() throws -> some IntentResult { try AlarmManager.shared.countdown(id: UUID(uuidString: alarmID)!) return .result() } static var title: LocalizedStringResource = "Repeat" static var description = IntentDescription("Repeat a countdown") @Parameter(title: "alarmID") var alarmID: String

Slide 58

Slide 58 text

ͨͩ͜Ε͚ͩͰ͸ Χ΢ϯτμ΢ϯ͕දࣔ͞Ε·ͤΜ

Slide 59

Slide 59 text

LiveActivityͱͷ࿈ܞ

Slide 60

Slide 60 text

Live Activities - Dynamic IslandରԠ Dynamic Island / ϩοΫը໘Ͱͷࢹ֮తମݧ Dynamic Island දࣔ ϩοΫը໘ ελϯόΠϞʔυ • ΞϥʔϜͷঢ়ଶ (.countdown, .paused) ʹԠͨ͡ϏϡʔΛఏڙ "DUJWJUZ,JUΛར༻ͯ͠ΧελϜ6*Λ࣮૷

Slide 61

Slide 61 text

Live Activities

Slide 62

Slide 62 text

ΧελϜϝλσʔλ ΑΓϦονͳΞϥʔϜମݧͷͨΊʹ AlarmMetadataΛ࢖ͬͯΞϥʔϜʹಠࣗͷ৘ใΛ෇༩ ΧελϜίϯςϯπ΍௥Ճ৘ใ "MBSN"UUSJCVUFTʹؚΊΔ͜ͱͰ -JWF"DUJWJUZଆͰDPOUFYUͱ͍͏ΦϒδΣΫτ͔ΒΞΫηεՄೳ ͦΕʹج͍ͮͨϦονͳ6*ΛಈతʹߏஙͰ͖Δ

Slide 63

Slide 63 text

ΧελϜϝλσʔλ struct CookingData: AlarmMetadata { let createdAt: Date let method: Method? enum Method: String, Codable { case stove case oven var icon: String { switch self { case .stove: "stove" case .oven: "oven" } } } }

Slide 64

Slide 64 text

Live Activities struct AlarmLiveActivity: Widget { var body: some WidgetConfiguration { ActivityConfiguration(for: AlarmAttributes.self) { context in // The Lock Screen presentation. lockScreenView(attributes: context.attributes, state: context.state) } dynamicIsland: { context in // The presentations that appear in the Dynamic Island. DynamicIsland { // The expanded Dynamic Island presentation. DynamicIslandExpandedRegion(.leading) { alarmTitle(attributes: context.attributes, state: context.state) } DynamicIslandExpandedRegion(.trailing) { cookingMethod(metadata: context.attributes.metadata) } DynamicIslandExpandedRegion(.bottom) { bottomView(attributes: context.attributes, state: context.state) } } compactLeading: { // The compact leading presentation. countdown(state: context.state, maxWidth: 44) .foregroundStyle(context.attributes.tintColor) } compactTrailing: { // The compact trailing presentation. AlarmProgressView(cookingMethod: context.attributes.metadata ? . method, mode: context.state.mode, tint: context.attributes.tintColor) } minimal: { // The minimal presentation. AlarmProgressView(cookingMethod: context.attributes.metadata ? . method, mode: context.state.mode, tint: context.attributes.tintColor) } .keylineTint(context.attributes.tintColor) } }

Slide 65

Slide 65 text

Live Activities struct AlarmLiveActivity: Widget { var body: some WidgetConfiguration { ActivityConfiguration(for: AlarmAttributes.self) { context in // The Lock Screen presentation. lockScreenView(attributes: context.attributes, state: context.state) } dynamicIsland: { context in // The presentations that appear in the Dynamic Island. DynamicIsland { // The expanded Dynamic Island presentation. DynamicIslandExpandedRegion(.leading) { alarmTitle(attributes: context.attributes, state: context.state) }

Slide 66

Slide 66 text

͜ΕͰΧ΢ϯτμ΢ϯλΠϚʔ΋ දࣔͰ͖Δʂ

Slide 67

Slide 67 text

࣍ʹϘλϯԡͨ࣌͠ͷॲཧ

Slide 68

Slide 68 text

App Intents ΧελϜΞΫγϣϯ Λ૊ΈࠐΉ ΞϥʔϜޙͷಠࣗϫʔΫϑϩʔ App Intent ఀࢭϘλϯɺηΧϯμϦϘλϯͷ྆ํʹରԠ AlarmManager.AlarmConfiguration stopIntent secondaryIntent secondaryButtonBehavior: .custom LiveActivityIntent PQFO"QQ8IFO3VO Πϯςϯτ࣮ߦ࣌ʹΞϓϦΛىಈ ىಈޙͷৄࡉϏϡʔදࣔͳͲɺෳࡶͳϫʔΫϑϩʔΛ࣮ݱ ΞϓϦىಈΧελϜॲཧ ϨγϐදࣔͳͲಛఆͷը໘ʹભҠ ΞϥʔϜൃՐ ϢʔβʔʹΞϥʔτ͕දࣔ͞ΕΔ ηΧϯμϦϘλϯλοϓ ΧελϜΞΫγϣϯΛτϦΨʔ "QQ*OUFOU࣮ߦ ϝιου͕ݺͼग़͞ΕΔ

Slide 69

Slide 69 text

͜ΕʹΑͬͯ ΞϥʔϜͷϘλϯΛλοϓͨ࣌͠ͷಈ࡞Λ ΧελϚΠζͰ͖ΔΑ͏ʹͳͬͨ

Slide 70

Slide 70 text

࣮ફσϞͱϕετϓϥΫςΟε

Slide 71

Slide 71 text

σϞ঺հ  Cook-itΞϓϦ ྉཧλΠϚʔΞϓϦͰ"MBSN,JUͷ׆༻Λ࣮ફʂ ྫྷଂݿͷ৯ࡐ͔ΒྉཧΛఏҊ͢ΔΞϓϦ ྉཧͷ޻ఔʹ͔͔Δ࣌ؒΛλΠϚʔͰදࣔ͢Δػೳ AlarmKitͷΧ΢ϯτμ΢ϯλΠϚʔͰදࣔ

Slide 72

Slide 72 text

No content

Slide 73

Slide 73 text

AlarmKitΛ࢖ͬͨମݧͷ޲্ Χ΢ϯτμ΢ϯλΠϚʔΛAlarmKitͰ࣮૷ LiveActivityͰλΠϚʔͱεςοϓදࣔͱ޻ఔΛදࣔ͢Δ λΠϚʔ͸ࣗલͷ࣮૷ͰΧόʔ ׬ྃޙ͸ΞϓϦΛىಈ ʢAppIntentsΛ࢖ͬͯΞϓϦΛىಈ͍ͯ͠ͳ͚Ε͹ϨγϐIDͱ εςοϓ͔Β௚લͷը໘ʹભҠͤ͞Δ͜ͱ΋Մೳʣ

Slide 74

Slide 74 text

AlarmKitΛ࢖ͬͨମݧͷ޲্ Χ΢ϯτμ΢ϯλΠϚʔΛAlarmKitͰ࣮૷ LiveActivityͰλΠϚʔͱεςοϓදࣔͱ޻ఔΛදࣔ͢Δ λΠϚʔ͸ࣗલͷ࣮૷ͰΧόʔ ׬ྃޙ͸ΞϓϦΛىಈ ʢAppIntentsΛ࢖ͬͯΞϓϦΛىಈ͍ͯ͠ͳ͚Ε͹ϨγϐIDͱ εςοϓ͔Β௚લͷը໘ʹભҠͤ͞Δ͜ͱ΋Մೳʣ

Slide 75

Slide 75 text

No content

Slide 76

Slide 76 text

ϕετϓϥΫςΟε AlarmKitΛޮՌతʹ׆༻͢ΔͨΊʹ ΞϥʔϜΛεέδϡʔϧ͢ΔલʹೝূΛϦΫΤετ ద੾ͳΤϥʔϋϯυϦϯάΛ࣮૷ DBO*NQPSU "MBSN,JU ͰॲཧΛ෼͚Δ ޙํޓ׵ੑΛҡ࣋ͨ͠։ൃ 6*͸ʮ෼͔Γ΍͢͞ʯΛ৺͕͚Δ ΞϥʔϜͷ಺༰ɺՄೳͳΞΫγϣϯΛ໌֬ʹ ΧελϜΧ΢ϯτμ΢ϯʹ͸Widget Extension͕΄΅ඞਢ ະ࣮૷ͩͱΧ΢ϯτμ΢ϯ͕ద੾ʹදࣔ͞ΕͣϢʔβʔʹԿ͕ى͖͍ͯΔ͔ద੾ͳ৘ใΛఏڙͰ͖ͳ

Slide 77

Slide 77 text

ϢʔβʔମݧΛ࠷༏ઌʹ ద੾ͳϢʔεέʔεͰAlarmKitΛ׆༻͠·͠ΐ͏

Slide 78

Slide 78 text

ΞϥʔϜͷద੾ͳ࢖༻ྫΛཧղ͢Δ ਪ঑͞ΕΔ࢖༻ྫ ΫοΩϯάλΠϚʔ εέδϡʔϧࢦఆͷ໨֮·͠ ϦϚΠϯμʔʢظݶ͋Γʣ ΠϕϯτΧ΢ϯτμ΢ϯ ඇਪ঑ͷ࢖༻ྫ ॏେͳ௨஌ʢҩྍɾ҆શؔ࿈ʣ ଈ࣌௨஌ͷ୅ସ όοΫάϥ΢ϯυॲཧͷτϦΨʔ ϢʔβʔମݧΛ࠷༏ઌʹɺద੾ͳϢʔεέʔεͰAlarmKitΛ׆༻͠·͠ΐ͏

Slide 79

Slide 79 text

AlarmKitͷඍົͳ఺ Χ΢ϯτμ΢ϯ৘ใ͕ϦΞϧλΠϜऔಘͰ͖ͳ͍ ७ਖ਼ΞϓϦͷΑ͏ʹ-JWF"DUJWJUZ͚ͩ͡Όͳ͘ΞϓϦ্ʹ දࣔͤ͞Δʹ͸ผͷ࢓૊Έ͕ඞཁʹͳΔ "1*ͷߏ଄͕৑௕త ࣮૷ྫΛݟͯ΋ΒͬͨΒΘ͔Δ௨ΓɺҰͭͷΞϥʔϜΛη οτ͢Δ͚ͩͰ΋͔ͳΓίʔυΛॻ͘ඞཁ͕͋Δ

Slide 80

Slide 80 text

·ͱΊͱల๬

Slide 81

Slide 81 text

ࠓޙͷల๬ AlarmKit͕୓͘Մೳੑ ଟ༷ͳΞϓϦ΁ͷԠ༻ ྉཧɺ݈߁؅ཧɺڭҭΞϓϦ εϚʔτϗʔϜ࿈ܞɺϫʔΫϑϩʔࣗಈԽ ྉཧΞϓϦ ݈߁؅ཧ ڭҭΞϓϦ εϚʔτϗʔϜ ෰ༀϦϚΠϯμʔ ༧ఆ؅ཧ

Slide 82

Slide 82 text

·ͱΊ AlarmKitͰΞϓϦ͕มΘΔ 4JMFOU.PEF'PDVT.PEFΛಥഁ͢Δ࣮֬ͳ௨஌ %ZOBNJD*TMBOEϩοΫը໘Ͱࢹ֮తʹΞϐʔϧ ΞϥʔϜޙͷಠࣗϫʔΫϑϩʔΛγʔϜϨεʹ

Slide 83

Slide 83 text

Thank You! ͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ʂ AlarmKitͷՄೳੑΛօ͞ΜͷΞϓϦͰͥͻ׆͔͍ͯͩ͘͠͞ ᠃ڮྋ iOS Developer & Creator Twitter(X) @tsuzuki817 GitHub tsuzukihashi ࣭͝໰͸DM·ͨ͸ϋογϡλάͰʂ iOSDC Japan 2025 | 2025/09/19 | Track D

Slide 84

Slide 84 text

"MBSN,JUΛ࢖ͬͨΞϓϦ଴ͬͯ·͢🫶