iOS14で追加されたWidget/ウィジット設定ダイアログについての発表資料。
・ウィジット略史 ・16ステップでできるウィジット設定ダイアログ
ΟδοτઃఆμΠΞϩά8JEHFU$POpHVSBUJPO$VTUPN*OUFOU
View Slide
ࣗݾհ
ೳొཁ !OPUPSPJEw J04ΞϓϦ։ൃऀw ߸͍Γ·͢ిࢉاըw !OPUPSPJEw !JSJNBTVw ࠷ۙͷಈw ϒϩά৽͠·ͨ͠
ॆిใࠂ͞Μ #BUUFSFDFJWFSw όοςϦʔϞχλʔ ϢʔςΟϦςΟʔw ࠷େ ࣮ػϦϞʔτw ख࣋ͪͷJ1IPOF͔Βଞʹ͍࣋ͬͯΔJ1IPOF J1BEͳͲͷػثͷόοςϦʔঢ়ଶ֬ೝՄೳw ࣗʹ͋ΔJ1IPOFͷόοςϦʔঢ়ଶ֬ೝՄೳ
ॆిใࠂ͞Μ #BUUFSFDFJWFSw "QQMF8BUDIରԠw $PNQMJDBUJPOTରԠw ॆిྃ௨w ॆిྃΛ͑ͯ͘ΕΔ௨ΛՃw ҎԼʹࢦఆ͢Δ͜ͱͰόοςϦʔΛέΞ͢Δ͜ͱ͕Մೳw Կ͔ͱߴ͍J1IPOFΛ࣋ͪͤ͞Δͷʹ༗༻
ॆిใࠂ͞Μ #BUUFSFDFJWFS/FXΟδοτʹରԠ͠·ͨ͠ J04ʙ4NBMM .FEJVN
ॆిใࠂ͞Μ #BUUFSFDFJWFSΟδοτઃఆΛՃ͠·ͨ͠ W
͢͜ͱw Οδοτུ࢙w 8JEHFU,JU8JEHFU$POpHVSBUJPOw $VTUPN*OUFOU
͞ͳ͍͜ͱw 4XJGU6*Λͬͨ8JEHFU,JUͷදࣔ
w Οδοτུ࢙w ΟδοτઃఆμΠΞϩάw ΟδοτઃఆμΠΞϩάͷ࡞εςοϓw ·ͱΊ
Οδοτུ࢙
J04ͰΟδοτରԠՃ͞Ε·ͨ͠
ͦͦΟδοτͬͯԿJ04ͷΟδοτʹͭͳ͕ΔΟδοτͱ
ḪΔ͜ͱ,POGBCVMBUPS :BIPP8JEHFU&OHJOF
:BIPP8JEHFU&OHJOF
:BIPP8JEHFU&OHJOFΞφϩά࣌ܭσδλϧ࣌ܭϛϡʔδοΫϓϨΠϠʔ8JpڧόοςϦʔྔϚοϓఱؾΰϛശΧϨϯμʔΧϨϯμʔ
"QQMF %BTICPBSE
%BTICPBSE 04ᶠΞφϩά࣌ܭఱؾ$BMDVMBUPSΧϨϯμʔ
%BTICPBSEΟδοτͷߏw εΩϡϞʔϑΟζϜw 8FC༝དྷͷٕज़w 9.-w &$."4DSJQUYw σʔλιʔεw γεςϜʹΞΫηεՄೳw ωοτϫʔΫͷΞΫηε
ॳJ1IPOFͷϧοΫεϥΠΫʹӨڹJ1IPOF(04ᶠΞϓϦ04ᶠ%BTICPBSEΟδοτJ1PE
ॳJ1IPOFͷϧοΫεϥΠΫʹӨڹJ1IPOF(04ᶠΞϓϦ04ᶠ%BTICPBSEΟδοτJ1PE˞΄΅049ͷػೳ͔Βͷ࣋ͪग़͕ͩ͠ɺɹ࣌ܭɺఱؾͳͲΟδοτͷӨڹ͕େ͖͍
Կ͕ݴ͍͍͔ͨͱ͍͏ͱ
J1IPOF্ཱͪ͛ॳϑΝʔεταʔυύʔςΟؚΊͯΟδοτతΞϓϦͱΞϓϦ͕ࠞࡏ
ͦͷޙɺΞϓϦࢢ্ཱ͕ͪΓͱڞʹΟδοτతΞϓϦ৹ࠪͰػೳෆͱΈͳ͞ΕΔΑ͏ʹ
ΞϓϦͷ֦ுػೳͱͯ͠5PEBZ&YUFOTJPO͕ొ
ΞϓϦͷ֦ுػೳͱͯ͠5PEBZ&YUFOTJPO͕ొ&YUFOTJPOٕज़ΛΊ͍͚ͨͩͷΤα
8JEHFU,JUൃදϚϧνϓϥοτϑΥʔϜΤωϧΪʔޮΛߟྀ
8JEHFU,JUൃදϚϧνϓϥοτϑΥʔϜΤωϧΪʔޮΛߟྀ4XJGU6**OUFOUٕज़ΛΊ͍͚ͨͩͷΤα
8JEHFU,JU8JEHFU$POpHVSBUJPO
8JEHFU$POpHVSBUJPOΟδοτઃఆμΠΞϩά
Οδοτઃఆԡ͠Ͱϝχϡʔදࣔ ઃఆ߲Ұཡ બࢶΛλοϓՄೳ
Οδοτઃఆԡ͠Ͱϝχϡʔදࣔ ઃఆ߲Ұཡ બࢶΛλοϓՄೳ$VTUPN*OUFOUQBSBNFUFSQBSBNFUFS
4JSJɺ4JSJ4IPSUDVUͰಋೖ͞Ε͍ͯͨ$VTUPN*OUFOUΛΟδοτઃఆμΠΞϩάͰ༻
$VTUPN*OUFOU$VTUPN*OUFOU)BOEMFS$VTUPN*OUFOU /46TFS"DUJWJUZ J04J1BE"QQ1BSBNFUFST04ͷհ*OUFOU໊*OUFOUҾ͖ͯ*OUFOUެ։
$VTUPN*OUFOU$VTUPN*OUFOU)BOEMFS$VTUPN*OUFOU1BSBNFUFST04ͷհJ04J1BE8JEHFU8JEHFUʹ$VTUPN*OUFOUΛख͠*OUFOU໊*OUFOUҾ͖ͯ*OUFOUެ։
ΟδοτઃఆμΠΞϩάͷεςοϓຖͷखॱ
αϯϓϧίʔυ
IUUQTHJUIVCDPNOPUPSPJE8JEHFU$POpHVSBUJPO%FNP
ΟδοτઃఆμΠΞϩάͷલఏJ04J1BEΞϓϦͷϓϩδΣΫτΟδοτλʔήοτΛՃ͢Δw ઃఆμΠΞϩά͖Οδοτઃఆ༻ʹΠϯςϯτ֦ுΛՃ͢Δ
બࢶ༻ͷఆٛ
enum DisplayTypeDefinition: String {case slot234 = "Slot2-3-4"case slot1 = "Slot1"case slot2 = "Slot2"case slot3 = "Slot3"case slot4 = "Slot4"func identifier() -> String {self.rawValue}func displayName() -> String {switch self {case .slot234:return "Stack(Slot2,3,4)"case .slot1:return "Slot1"case .slot2:return "Slot2"case .slot3:return "Slot3"case .slot4:return "Slot4"}}}
εςοϓͰऴΘΔΟδοτઃఆμΠΞϩά
̏ͭͷث"QQ 8JEHFU *OUFOUΛຬͨͤ
ΟδοτλʔήοτΛՃᶃ
ΟδοτλʔήοτΛՃᶄ
*OUFOUEFpOJUJPOΛઃఆ͢Δᶃ
*OUFOUEFpOJUJPOΛઃఆ͢Δᶄ
*OUFOUEFpOJUJPOΛઃఆ͢Δᶅ
*OUFOUEFpOJUJPOΛઃఆ͢Δᶆ
*OUFOUEFpOJUJPOΛઃఆ͢Δᶇ
*OUFOUEFpOJUJPOΛઃఆ͢Δᶈ
Οδοτઃఆ༻*OUFOUTΛՃ͢Δᶃ
Οδοτઃఆ༻*OUFOUTΛՃ͢Δᶄ
Οδοτઃఆ༻*OUFOUTΛՃ͢Δᶅ
4VQQPSUFE*OUFOUTΛઃఆ
ྻڍఆٛΛՃ
*OUFOU)BOEMFSΛஔ͖͑Δ
class IntentHandler: INExtension, ConfigurationIntentHandling {func provideDisplayTypeOptionsCollection(for intent: ConfigurationIntent, with completion:@escaping (INObjectCollection?, Error?) -> Void) {let displayTypeDefinitions: [DisplayTypeDefinition] = [ .slot234,.slot1,.slot2,.slot3,.slot4]let displayType = displayTypeDefinitions.map { (displayTypeDefinition) -> DisplayType inDisplayType(identifier: displayTypeDefinition.identifier(), display:displayTypeDefinition.displayName())}completion(INObjectCollection(items: displayType), nil)}func defaultDisplayType(for intent: ConfigurationIntent) -> DisplayType? {return DisplayType(identifier: DisplayTypeDefinition.slot234.identifier(), display:DisplayTypeDefinition.slot234.displayName())}}
8JEHFU͔ΒઃఆΛ͏ᶃ
8JEHFU͔ΒઃఆΛ͏ᶄ
struct GraphEntryView : View {var entry: Provider.Entryfunc displayType() -> DisplayTypeDefinition {let defaultValue = DisplayTypeDefinition.slot234let rawValue = entry.configuration.displayType?.identifier ??defaultValue.identifier()return DisplayTypeDefinition(rawValue: rawValue) ?? defaultValue}var body: some View {switch self.displayType() {case .slot234:return Text("ελοΫදࣔ")default:return Text("ͦͷଞ")}}}
ΑΓৄ͘͠Γ͍ͨํIUUQTJSJNBTVDPNUBHXJEHFULJU
·ͱΊw Οδοτػೳ͕։ൃऀͷΤαͱͯ͠࠶ొ͠·ͨ͠w "QQMF͕ͬͯ΄͍ٕ͠ज़4XJGU6*$VTUPN*OUFOUTͰ͢w $VTUPN*OUFOTΛऔΓѻ͏ͨΊʹ׳Ε͕ඞཁͰ͢w ͨͩ͠8JEHFUΛ࡞Δػձࠓͷͱ͜Ζͳ͍Ͱ͢
IUUQTJSJNBTVDPN<13>#MPHਵ࣌ߘத