Slide 1

Slide 1 text

J04΢ΟδΣοτΛ ͭͬͯ͘Έͨ .PCJMF"DU0/-*/& JUPL!ͦΒ͔ͥ

Slide 2

Slide 2 text

JUPL!ͦΒ͔ͥ w ͍ͱ͏͚͍ʢJUPLʣ w ɹɹɹɹɹɹͷதͷਓ w ϞόΠϧΞϓϦΤϯδχΞ݉$&0 w ෭ۀͰϑϦʔϥϯεత w IUUQTJUPLKQ IUUQTTPSBLB[FDPKQ !JUPLKQ

Slide 3

Slide 3 text

ॴࡏ஍ɿژ౎ࢢதژ۠ ࣾһਓࣗ෼

Slide 4

Slide 4 text

࣮੷ डୗ ࣗࣾ

Slide 5

Slide 5 text

J04"OESPJENBD048JOEPXTαʔό ҰਓͰ΍ͬͯ·͢ʢσβΠϯҎ֎ʣ

Slide 6

Slide 6 text

iOS൛ v10.0.0

Slide 7

Slide 7 text

No content

Slide 8

Slide 8 text

J04 ΢ΟδΣοτΛ ͭͬͯ͘Έͨ

Slide 9

Slide 9 text

·ͣ஫ҙࣄ߲

Slide 10

Slide 10 text

4XJGU6*ඞਢ

Slide 11

Slide 11 text

6*,JU࢖͑·ͤΜ

Slide 12

Slide 12 text

6*7JFX3FQSFTFOUBCMFΛ ࢖͏ͱ͜͏ͳΔ

Slide 13

Slide 13 text

ࢀߟ w 88%$ w 8JEHFU,JUʹ͍ͭͯ w 8JEHFU$PEF"MPOHʙ

Slide 14

Slide 14 text

΢ΟδΣοτͷछྨ

Slide 15

Slide 15 text

TNBMM NFEJVN MBSHF ֎ݟ ૢ࡞ શମλοϓͷΈ શମ೚ҙͷྖҬλοϓ

Slide 16

Slide 16 text

ૢ࡞ w શମλοϓ w ೚ҙͷྖҬλοϓ { }.widgetURL(url) Link(destination: url) { }

Slide 17

Slide 17 text

جຊߏ଄ 8JEHFU 8JEHFU$POpHVSBUJPO 5JNFMJOF1SPWJEFS 7JFX 5JNFMJOF&OUSZ

Slide 18

Slide 18 text

جຊߏ଄ struct MyWidget: Widget { public var body: some WidgetConfiguration { StaticConfiguration(kind: kind, provider: MyProvider()) { entry in MyWidgetEntryView(entry: entry) } } } struct MyProvider: TimelineProvider { func getTimeline(in context: Context, completion: @escaping (Timeline) -> Void) { ... completion(Timeline(entries: entries, policy: .atEnd)) } } struct MyWidgetEntryView : View { var entry: MyEntry var body: some View { ... } }

Slide 19

Slide 19 text

ઃఆʢTUBUJDʣ͋Γ 8JEHFU 8JEHFU$POpHVSBUJPO *OUFOU 7JFX 5JNFMJOF&OUSZ 5JNFMJOF1SPWJEFS

Slide 20

Slide 20 text

ઃఆʢEZOBNJDʣ͋Γ 8JEHFU 8JEHFU$POpHVSBUJPO *OUFOU 7JFX 5JNFMJOF&OUSZ 5JNFMJOF1SPWJEFS *OUFOU&YUFOTJPO

Slide 21

Slide 21 text

ઃఆ͋Γ struct MyWidget: Widget { public var body: some WidgetConfiguration { IntentConfiguration(kind: kind, intent: MySelectionIntent.self, provider: MyIntentProvider()) { entry in MyWidgetEntryView(entry: entry) } } } struct MyIntentProvider: IntentTimelineProvider { func getTimeline(for configuration: MySelectionIntent, in context: Context, completion: @escaping (Timeline) -> Void) { ... completion(Timeline(entries: entries, policy: .after(date))) } }

Slide 22

Slide 22 text

IntentHandler.swift class IntentHandler: INExtension, MySelectionIntentHandling { func provideParameterOptionsCollection( for intent: MySelectionIntent, with completion: @escaping (INObjectCollection?, Error?) -> Void) { completion(INObjectCollection(items: items), nil) } *OUFOU&YUFOTJPO .Z4FMFDUJPOJOUFOUEFpOJUJPO

Slide 23

Slide 23 text

ߋ৽ public struct TimelineReloadPolicy : Equatable { // entries͕શ෦ऴΘͬͨΒߋ৽ public static let atEnd: TimelineReloadPolicy // ߋ৽͠ͳ͍ public static let never: TimelineReloadPolicy // ࢦఆ࣌ؒʹߋ৽ public static func after(_ date: Date) -> TimelineReloadPolicy } // ΞϓϦଆ͔Βߋ৽Λଅ͢͜ͱ΋ WidgetCenter.shared.reloadAllTimelines() ࣮ࡍͷߋ৽λΠϛϯά͸ ࠷ऴతʹ04͕͍͍ײ͡ʹௐ੔͢ΔͷͰ஫ҙ

Slide 24

Slide 24 text

ෳ਺΢ΟδΣοτ 8JEHFU#VOEMF 8JEHFUᶄ 8JEHFUᶃ *OUFOU&YUFOTJPO @main struct Bundle: WidgetBundle { @WidgetBundleBuilder var body: some Widget { Widget1() Widget2() } }

Slide 25

Slide 25 text

͍͞͝ʹ w ΢ΟδΣοτରԠ͍ͯ͜͠͏ʂ w Ͱ΋ΞϓϦຊମ΁ͷ༠ಋ΋େࣄʁʢϏδωεతʹʣ w ΄ͲΑ͍৘ใͷόϥϯε۩߹ΛݟۃΊͯ