ä»å¹Žã¯ãiOSéçºè ã
å®çŸ©ããå§ããŸããã-ãŠã£ãžã§ããã¯ãã¡ã€ã³ã®ã¢ãã€ã«ã¢ããªã±ãŒã·ã§ã³ãèµ·åããã«é¢é£æ å ±ã衚瀺ãããã¥ãŒã§ãããåžžã«ãŠãŒã¶ãŒã®æå ã«ãããŸãããããã䜿çšããæ©èœã¯ãiOS 8以éã®iOSïŒToday ExtensionïŒã«ãã§ã«ååšããŸããããããã䜿çšããç§ã®çŽç²ã«å人çãªçµéšã¯ããªãæ²ããã§ã-ãŠã£ãžã§ãããåããç¹å¥ãªãã¹ã¯ãããããããã«å²ãåœãŠãããŠããŸãããç§ã¯ãŸã ããã«å°éããããšã¯ãã£ãã«ãªããç¿æ £ã¯çºéããŠããŸããã
ãã®çµæãiOS 14ã§ã¯ããŠã£ãžã§ããã埩掻ãããšã³ã·ã¹ãã ã«çµ±åãããïŒçè«çã«ã¯ïŒãããŠãŒã¶ãŒãã¬ã³ããªãŒã«ãªããŸããã
ãã€ã€ã«ãã£ã«ãŒãã®æäœã¯ããŠã©ã¬ããã¢ããªã±ãŒã·ã§ã³ã®äž»ãªæ©èœã®1ã€ã§ããä»æ¥ã«ãŠã£ãžã§ãããè¿œå ããå¯èœæ§ã«ã€ããŠã®ãŠãŒã¶ãŒããã®ææ¡ã¯ãAppStoreã®ã¬ãã¥ãŒã«è¡šç€ºãããããšããããŸãããã§ãã¯ã¢ãŠãæã«ããŠãŒã¶ãŒã¯ã§ããã ãæ©ãã«ãŒããæ瀺ããå²åŒãåããŠããžãã¹ã«ã€ããŠéãåºããããšèããŠããŸããããã¯ãã¿ã€ã ã¹ã©ã€ã¹ãé ãããšãéåžžã«éé£ãããå€èŠ³ããã¥ãŒã«è¡šç€ºãããããã§ãããã®å ŽåããŠã£ãžã§ããã¯ã«ãŒããéãããã®ããã€ãã®ãŠãŒã¶ãŒã¢ã¯ã·ã§ã³ãä¿åã§ããããããã§ãã¯ã¢ãŠãæã®ååã®æ¯æããéããªããŸããåºèãæè¬ããŸã-ãã§ãã¯ã¢ãŠãæã®ãã¥ãŒãå°ãªããªããŸãã
ä»å¹ŽãAppleã¯ãã¬ãŒã³ããŒã·ã§ã³ã®ã»ãŒçŽåŸã«äºæããiOSãªãªãŒã¹ããªãªãŒã¹ããéçºè ã¯Xcode GMã§ã¢ããªã±ãŒã·ã§ã³ãå®æãããæ¥ãæ®ããŸããããiOSããŒã ãXcodeã®ããŒã¿ããŒãžã§ã³ã§ç¬èªã®ããŒãžã§ã³ã®ãŠã£ãžã§ãããäœæãå§ããããããªãªãŒã¹ã®æºåãæŽããŸããã ..ããŠã£ãžã§ããã¯çŸåšAppStoreã§ã¬ãã¥ãŒãããŠããŸããçµ±èšã«ãããšãããã€ã¹ãæ°ããiOSã«æŽæ°ããã®ã¯ããªãé«éã§ããã»ãšãã©ã®å ŽåããŠãŒã¶ãŒã¯ã©ã®ã¢ããªã±ãŒã·ã§ã³ã«æ¢ã«ãŠã£ãžã§ããããããã確èªãããŠã£ãžã§ãããèŠã€ããŠæºè¶³ããŸãã
å°æ¥çã«ã¯ãæ®é«ãããŒã³ãŒããããŒãããŒããã®æåŸã®æªèªã¡ãã»ãŒãžãéç¥ïŒããšãã°ããŠãŒã¶ãŒãã¢ã¯ã·ã§ã³ãå®è¡ããå¿ èŠããããªã©ãã«ãŒãã確èªãŸãã¯ã¢ã¯ãã£ãåããïŒãªã©ãããã«é¢é£æ§ã®é«ãæ å ±ãè¿œå ããããšèããŠããŸããçŸæç¹ã§ã¯ãçµæã¯æ¬¡ã®ããã«ãªããŸãã
ãããžã§ã¯ããžã®ãŠã£ãžã§ããã®è¿œå
ä»ã®åæ§ã®è¿œå æ©èœãšåæ§ã«ããŠã£ãžã§ããã¯ã¡ã€ã³ãããžã§ã¯ãã®æ¡åŒµæ©èœãšããŠè¿œå ãããŸããè¿œå ããããšãXcodeã¯ãŠã£ãžã§ãããšä»ã®ã³ã¢ã¯ã©ã¹ã®ã³ãŒãã芪åã«çæããŸãããããã¯ãæåã®èå³æ·±ãæ©èœãç§ãã¡ãåŸ ã£ãŠããå Žæã§ã-ç§ãã¡ã®ãããžã§ã¯ãã§ã¯ããã¡ã€ã«ã®1ã€ã§ãã¬ãã£ãã¯ã¹ãã¯ã©ã¹åã«èªåçã«æ¿å ¥ãããããïŒã¯ããåãObj-Cãã¬ãã£ãã¯ã¹ïŒïŒãçæããããã¡ã€ã«ã«ã¯æ¿å ¥ãããªãã£ãããããã®ã³ãŒãã¯ã³ã³ãã€ã«ãããŸããã§ãããèšãããŠããããã«ãéãçããã®ã¯ç¥ã§ã¯ãããŸãããæããã«ãAppleå ã®ç°ãªãããŒã ã¯åœŒãã®éã§åæããŸããã§ããã圌ãããªãªãŒã¹ããŒãžã§ã³ã§ãããä¿®æ£ããããšãæåŸ ããŸãããããããžã§ã¯ãã®ãã¬ãã£ãã¯ã¹ãã«ã¹ã¿ãã€ãºããã«ã¯ãã¢ããªã±ãŒã·ã§ã³ã®ã¡ã€ã³ã¿ãŒã²ããã®ãã¡ã€ã«ã€ã³ã¹ãã¯ã¿ãŒã§ã[ã¯ã©ã¹ãã¬ãã£ãã¯ã¹]ãã£ãŒã«ãã«å ¥åããŸãã
WWDCã®ãã¥ãŒã¹ããã©ããŒããŠãã人ã«ãšã£ãŠããŠã£ãžã§ããã®å®è£ ãSwiftUIã䜿çšããŠã®ã¿å¯èœã§ããããšã¯åšç¥ã®äºå®ã§ããèå³æ·±ãç¹ã¯ããã®ããã«ããŠAppleããã¯ãããžãŒã®æŽæ°ã匷å¶ããŠããããšã§ããã¡ã€ã³ã¢ããªã±ãŒã·ã§ã³ãUIKitã䜿çšããŠäœæãããŠããå Žåã§ããå¿ èŠã«å¿ããŠSwiftUIã®ã¿ã䜿çšããŸããäžæ¹ãããã¯æ©èœãäœæããããã®æ°ãããã¬ãŒã ã¯ãŒã¯ãè©Šãè¯ãæ©äŒã§ãããã®å Žåãããã»ã¹ã«å¿«é©ã«é©åããŸããç¶æ ã®å€æŽãããã²ãŒã·ã§ã³ã¯ãªããéçUIã宣èšããã ãã§ããã€ãŸããTodayã®å€ããŠã£ãžã§ããã«ã¯ããå€ãã®ããžãã¯ãšã¢ãã¡ãŒã·ã§ã³ãå«ããããšãã§ãããããæ°ãããã¬ãŒã ã¯ãŒã¯ãšãšãã«ãæ°ããå¶éã衚瀺ãããŸãã
SwiftUIã®äž»ãªé©æ°ã®1ã€ã¯ãã·ãã¥ã¬ãŒã¿ãŒãŸãã¯ããã€ã¹ã§èµ·åããã«ãã¬ãã¥ãŒããæ©èœã§ãïŒãã¬ãã¥ãŒïŒããã°ãããããšã§ãããæ®å¿µãªããã倧èŠæš¡ãªãããžã§ã¯ãïŒç§ãã¡ã®å Žåã¯çŽ400Kè¡ã®ã³ãŒãïŒã§ã¯ãäžäœã®MacBookã§ãåäœãéåžžã«é ããããã€ã¹ã§ã®å®è¡ãé«éã§ããããã«ä»£ããæ¹æ³ã¯ãè¿ éãªãããã¿ã€ãã³ã°ã®ããã«ç©ºã®ãããžã§ã¯ããŸãã¯éã³å Žãçšæããããšã§ãã
å°çšã®Xcodeã¹ããŒãã䜿çšããŠãããã°ããããšãã§ããŸããã·ãã¥ã¬ãŒã¿ãŒã§ã¯ãããŒãžã§ã³Xcode 12ããŒã¿6ã§ããããã°ãäžå®å®ã«ãªãããããã¹ãããã€ã¹ã®1ã€ãå¯ä»ããiOS 14ã«ã¢ããã°ã¬ãŒãããŠããã¹ãããããšããå§ãããŸãããã®éšåã¯ãªãªãŒã¹ããŒãžã§ã³ã§ã¯æåŸ ã©ããã«æ©èœããªãããšã«æ³šæããŠãã ããã
ã€ã³ã¿ãŒãã§ãŒã¹
ãŠãŒã¶ãŒã¯ãå°ãäžã倧ã®3ã€ã®ãµã€ãºã®ãŠã£ãžã§ããã®ããŸããŸãªã¿ã€ãïŒWidgetFamilyïŒããéžæã§ããŸãã ç»é²ããã«ã¯ããµããŒããããŠãããã®ãæ瀺çã«æå®ããå¿ èŠããããŸãã
struct CardListWidget: Widget {
public var body: some WidgetConfiguration {
IntentConfiguration(kind: âCardListWidgetKindâ,
intent: DynamicMultiSelectionIntent.self,
provider: CardListProvider()) { entry in
CardListEntryView(entry: entry)
}
.configurationDisplayName(" ")
.description(", ")
.supportedFamilies([.systemSmall, .systemMedium])
}
}
ç§ã®ããŒã ãšç§ã¯äžå°ã«åºå·ããããšã«ããŸãã-å°ããªãŠã£ãžã§ããã®å Žåã¯ãæ°ã«å ¥ãã®ã«ãŒãã1æãäžåã®å Žåã¯4æ衚瀺ããŸãã
ãŠã£ãžã§ããã¯ã³ã³ãããŒã«ã»ã³ã¿ãŒãããã¹ã¯ãããã«è¿œå ããããŠãŒã¶ãŒã¯å¿ èŠãªã¿ã€ããéžæã
ãŸããAssets.xcassets-> AccentColorã䜿çšããŠã[ãŠã£ãžã§ããã®è¿œå ]ãã¿ã³ã®è²ãã«ã¹ã¿ãã€ãºããŸãããŠã£ãžã§ããã®ååã«ã説æããããŸãïŒäžèšã®ãµã³ãã«ã³ãŒãïŒã
ãµããŒããããŠãããã¥ãŒã®æ°ã«å¶éãããå Žåã¯ãWidgetBundleã䜿çšããŠæ¡åŒµã§ããŸãã
@main
struct WalletBundle: WidgetBundle {
@WidgetBundleBuilder
var body: some Widget {
CardListWidget()
MySecondWidget()
}
}
ãŠã£ãžã§ããã«ã¯ããç¶æ ã®ã¹ãããã·ã§ããã衚瀺ãããããããŠãŒã¶ãŒãšã®å¯Ÿè©±ã®å¯äžã®å¯èœæ§ã¯ãããã€ãã®èŠçŽ ãŸãã¯ãŠã£ãžã§ããå šäœãã¯ãªãã¯ããŠã¡ã€ã³ã¢ããªã±ãŒã·ã§ã³ã«åãæ¿ããããšã§ããã¢ãã¡ãŒã·ã§ã³ãããã²ãŒã·ã§ã³ããŸãã¯ä»ã®ãã¥ãŒãžã®é·ç§»ã¯ãããŸããããã ããã¡ã€ã³ã¢ããªã±ãŒã·ã§ã³ã«æ·±ããªã³ã¯ãããããããããšã¯å¯èœã§ãããã®å Žåãå°ããªãŠã£ãžã§ããã®å Žåãã¯ãªãã¯ãŸãŒã³ã¯é åå šäœã§ããããã®å ŽåãwidgetURLïŒ_ :)ã¡ãœããã䜿çšããŸããäžèŠæš¡ããã³å€§èŠæš¡ã®å Žåããã¥ãŒã¯ãªãã¯ãå©çšå¯èœã§ãããSwiftUIã®ãªã³ã¯æ§é ãããã«åœ¹ç«ã¡ãŸãã
Link(destination: card.url) {
CardView(card: card)
}
2ã€ã®ãµã€ãºã®ãŠã£ãžã§ããã®æçµãã¥ãŒã¯ã次ã®ããã«ãªããŸããã
ãŠã£ãžã§ããã®ã€ã³ã¿ãŒãã§ã€ã¹ãèšèšããå Žåã次ã®ã«ãŒã«ãšèŠä»¶ã圹ç«ã¡ãŸãïŒAppleã¬ã€ãã©ã€ã³ã«ããïŒã
- ãŠã£ãžã§ããã1ã€ã®ã¢ã€ãã¢ãšåé¡ã«éäžãããã¢ããªã±ãŒã·ã§ã³ã®ãã¹ãŠã®æ©èœãç¹°ãè¿ãããšããªãã§ãã ããã
- ã³ã³ãã³ããæ¡å€§çž®å°ããã ãã§ãªãããµã€ãºã«å¿ããŠããå€ãã®æ å ±ã衚瀺ããŸãã
- 1æ¥ãéããŠå€åããå¯èœæ§ã®ããåçãªæ å ±ã衚瀺ããŸããå®å šã«éçãªæ å ±ãæ¯åå€åããæ å ±ãšãã圢ã®æ¥µç«¯ãªãã®ã¯æè¿ãããŸããã
- ãŠã£ãžã§ããã¯ããŠãŒã¶ãŒã«é¢é£æ å ±ãæäŸããå¿ èŠããããã¢ããªã±ãŒã·ã§ã³ãéãå¥ã®æ¹æ³ã§ã¯ãããŸããã
å€èŠ³ã¯ã«ã¹ã¿ãã€ãºãããŠããŸãã次ã®ã¹ãããã¯ããŠãŒã¶ãŒã«è¡šç€ºããã«ãŒããšãã®æ¹æ³ãéžæããããšã§ããæããã«4æ以äžã®ã«ãŒããååšããå¯èœæ§ããããŸããããã€ãã®ãªãã·ã§ã³ãèããŠã¿ãŸãããã
- ãŠãŒã¶ãŒãã«ãŒããéžæã§ããããã«ããŸãã圌ã§ã¯ãªãã«ããŠãã誰ãã©ã®ã«ãŒããããéèŠããç¥ã£ãŠããŸãïŒ
- æåŸã«äœ¿çšãããããã衚瀺ããŸãã
- ããšãã°ãææ¥ãšææ¥ãçµ±èšã«çŠç¹ãåœãŠãŠãããã¹ããŒããªã¢ã«ãŽãªãºã ãäœæããŸãïŒãŠãŒã¶ãŒãå¹³æ¥ã«å®¶ã®è¿ãã®ãã«ãŒãã·ã§ããã«è¡ããé±æ«ã«ãã€ããŒããŒã±ããã«è¡ãå Žåããã®ç¬éã«ãŠãŒã¶ãŒãå©ããç®çã®ã«ãŒãã衚瀺ã§ããŸãïŒ
ãããã¿ã€ãã®äžéšãšããŠããŠã£ãžã§ããã§çŽæ¥ãã©ã¡ãŒã¿ãŒãæ§æããæ©èœãåæã«è©Šãããã«ãæåã®ãªãã·ã§ã³ã決å®ããŸãããã¢ããªã±ãŒã·ã§ã³å ã«ç¹å¥ãªç»é¢ãäœæããå¿ èŠã¯ãããŸããããããããŠãŒã¶ãŒã¯ã圌ããèšãããã«ããããã®èšå®ãèŠã€ããã®ã«ååãªçµéšããããŸããïŒ
ã«ã¹ã¿ã ãŠã£ãžã§ããèšå®
èšå®ã¯ã€ã³ãã³ãã䜿çšããŠçæãããŸãïŒããã«ã¡ã¯Androidéçºè ïŒ-æ°ãããŠã£ãžã§ãããäœæãããšãã€ã³ãã³ããã¡ã€ã«ããããžã§ã¯ãã«èªåçã«è¿œå ãããŸããã³ãŒããžã§ãã¬ãŒã¿ã¯ãSiriKitãã¬ãŒã ã¯ãŒã¯ã®äžéšã§ããINIntentããç¶æ¿ããã¯ã©ã¹ãæºåããŸããã€ã³ãã³ããã©ã¡ãŒã¿ã«ã¯ããã€ã³ãã³ãã¯ãŠã£ãžã§ããã«é©æ Œã§ãããšããéæ³ã®ãªãã·ã§ã³ãå«ãŸããŠããŸããããã€ãã®ã¿ã€ãã®ãã©ã¡ãŒã¿ãŒã䜿çšå¯èœã§ããããµãã¿ã€ããã«ã¹ã¿ãã€ãºã§ããŸãããã®å Žåã®ããŒã¿ã¯åçãªã¹ãã§ãããããããªãã·ã§ã³ã¯åçã«æäŸãããŸãããšããé ç®ãèšå®ããŸãã
ãŠã£ãžã§ããã®çš®é¡ããšã«ããªã¹ãå ã®ã¢ã€ãã ã®æ倧æ°ãèšå®ããŸãïŒå°1ã®å Žåãäž4ã®å ŽåïŒã
ãã®ã¿ã€ãã®ã€ã³ãã³ãã¯ããŠã£ãžã§ããã«ãã£ãŠããŒã¿ãœãŒã¹ãšããŠäœ¿çšãããŸãã
次ã«ãæ§æãããã€ã³ãã³ãã¯ã©ã¹ãIntentConfigurationæ§æã«é 眮ããå¿ èŠããããŸãã
struct CardListWidget: Widget {
public var body: some WidgetConfiguration {
IntentConfiguration(kind: WidgetConstants.widgetKind,
intent: DynamicMultiSelectionIntent.self,
provider: CardListProvider()) { entry in
CardListEntryView(entry: entry)
}
.configurationDisplayName(" ")
.description(", .")
.supportedFamilies([.systemSmall, .systemMedium])
}
}
ãŠãŒã¶ãŒèšå®ãäžèŠãªå Žåã¯ãStaticConfigurationã¯ã©ã¹ã®åœ¢åŒã§ãã€ã³ãã³ããæå®ããã«æ©èœãã代æ¿æ段ããããŸãã
ã¿ã€ãã«ãšèª¬æã¯èšå®ç»é¢ã§ç·šéã§ããŸãã
ãŠã£ãžã§ããã®ååã¯1è¡ã«åãŸãå¿ èŠããããŸããåãŸããªãå Žåã¯ãåãæšãŠãããŸããåæã«ãè¿œå ç»é¢ãšãŠã£ãžã§ããèšå®ã®èš±å®¹é·ããç°ãªããŸãã
äžéšã®ããã€ã¹ã®ååã®æ倧é·ã®äŸïŒ
iPhone 11 Pro Max
28
21
iPhone 11 Pro
25
19
iPhone SE
24
19
説æã¯è€æ°è¡ã§ããèšå®ã®ããã¹ããéåžžã«é·ãå Žåã¯ãã³ã³ãã³ããã¹ã¯ããŒã«ã§ããŸããããããè¿œå ç»é¢ã§ã¯ããŠã£ãžã§ããã®ãã¬ãã¥ãŒãæåã«å§çž®ããã次ã«ã¬ã€ã¢ãŠãã«äœãã²ã©ãããšãèµ·ãããŸãã
ãŸããèæ¯è²ãšã®å€ãå€æŽããããšãã§ããŸãWidgetBackgroundãšAccentColorãã©ã¡ãŒã¿ã-ããã©ã«ãã§ã¯ã圌ãã¯ãã§ã«ããè³ç£ãå¿ èŠãªå Žåã¯ããŠã£ãžã§ããèšå®ã§ååãå€æŽããããšãã§ãããã«ãèšå®ã§è³ç£ã«ã¿ãã°ã³ã³ãã€ã©ãŒ-ãªãã·ã§ã³ã°ã«ãŒãå ã®ãŠã£ãžã§ããã®èæ¯è²åãšã°ããŒãã«ã¢ã¯ã»ã³ãè²åã®ãã£ãŒã«ãããããããã
ãªã¬ãŒã·ã§ã³ã·ãã èšå®ãä»ããŠå¥ã®ãã©ã¡ãŒã¿ãŒã§éžæããå€ã«å¿ããŠãäžéšã®ãã©ã¡ãŒã¿ãŒãé衚瀺ïŒãŸãã¯è¡šç€ºïŒã«ããããšãã§ããŸãã
ãã©ã¡ãŒã¿ãç·šéããããã®UIã¯ããã®ã¿ã€ãã«ãã£ãŠç°ãªãããšã«æ³šæããŠãã ãããããšãã°ãBooleanãæå®ãããšãUISwitchã衚瀺ãããIntegerãæå®ãããšãUITextfieldãä»ããå ¥åããŸãã¯UIStepperãä»ãã段éçãªå€æŽã®2ã€ã®ãªãã·ã§ã³ãéžæã§ããŸãã
ã¡ã€ã³ã¢ããªã±ãŒã·ã§ã³ãšã®çžäºäœçšã
ãã³ãã«ã¯æ§æãããŠããŸãããã€ã³ãã³ãèªäœãå®éã®ããŒã¿ãã©ãããååŸãããã決å®ããå¿ èŠããããŸãããã®å Žåã®ã¡ã€ã³ã¢ããªã±ãŒã·ã§ã³ãšã®ããªããžã¯ãäžè¬ã°ã«ãŒãïŒApp GroupsïŒå ã®ãã¡ã€ã«ã§ããã¡ã€ã³ã¢ããªã±ãŒã·ã§ã³ãæžã蟌ã¿ããŠã£ãžã§ãããèªã¿åããŸãã
äžè¬ã°ã«ãŒããžã®URLãååŸããã«ã¯ã次ã®ã¡ãœããã䜿çšããŸãã
FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: âgroup.ru.yourcompany.yourawesomeappâ)
éžæçšã®èŸæžãšããŠèšå®ã§ãŠãŒã¶ãŒã䜿çšããããããã¹ãŠã®åè£ãä¿åããŸãã
次ã«ããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã¯ãããŒã¿ãæŽæ°ãããããšã確èªããå¿ èŠããããŸããããã次ã®ããã«åŒã³åºããŸãã
WidgetCenter.shared.reloadAllTimelines()
// WidgetCenter.shared.reloadTimelines(ofKind: "kind")
ã¡ãœããåŒã³åºãã¯ãŠã£ãžã§ããã®ã³ã³ãã³ããšã¿ã€ã ã©ã€ã³å šäœããªããŒããããããã·ã¹ãã ãéè² è·ã«ãªããªãããã«ãããŒã¿ãå®éã«æŽæ°ããããšãã«äœ¿çšããŠãã ããã
ããŒã¿ã®æŽæ°
ãŠãŒã¶ãŒããã€ã¹ã®ããããªãŒãåŠçããããã«ãAppleã¯ãã¿ã€ã ã©ã€ã³ã䜿çšããŠãŠã£ãžã§ããäžã®ããŒã¿ãæŽæ°ããã¡ã«ããºã ãã€ãŸãã¹ãããã·ã§ãããçæããã¡ã«ããºã ãèãåºããŸãããéçºè ã¯ããã¥ãŒãçŽæ¥æŽæ°ãŸãã¯ç®¡çããã®ã§ã¯ãªãããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ãããã¯ã°ã©ãŠã³ãã§ã¹ãããã·ã§ãããã«ããããããã®ã¹ã±ãžã¥ãŒã«ãæäŸããŸãã
æŽæ°ã¯ã次ã®ã€ãã³ãã§è¡ãããŸãã
- 以åã«äœ¿çšããWidgetCenter.shared.reloadAllTimelinesïŒïŒãåŒã³åºã
- ãŠãŒã¶ãŒããŠã£ãžã§ããããã¹ã¯ãããã«è¿œå ãããšã
- èšå®ãç·šéããå Žåã
ãŸããéçºè ã«ã¯ãã¿ã€ã ã©ã€ã³ãæŽæ°ããããã®3çš®é¡ã®ããªã·ãŒïŒTimelineReloadPolicyïŒããããŸã
ãatEnd-æåŸã®ã¹ãããã·ã§ããã衚瀺ããåŸã«æŽæ°ã
ãªã-匷å¶åŒã³åºãã®å Žåã«ã®ã¿æŽæ°ãã
ïŒ_ïŒïŒ -äžå®æéåŸã«æŽæ°ããã
ãã®å Žåãã¡ã€ã³ã¢ããªã±ãŒã·ã§ã³ã§ã«ãŒãããŒã¿ãæŽæ°ããããŸã§ãã·ã¹ãã ã«1ã€ã®ã¹ãããã·ã§ãããäœæããããã«èŠæ±ããã ãã§ååã§ãã
struct CardListProvider: IntentTimelineProvider {
public typealias Intent = DynamicMultiSelectionIntent
public typealias Entry = CardListEntry
public func placeholder(in context: Context) -> Self.Entry {
return CardListEntry(date: Date(), cards: testData)
}
public func getSnapshot(for configuration: Self.Intent, in context: Self.Context, completion: @escaping (Self.Entry) -> Void) {
let entry = CardListEntry(date: Date(), cards: testData)
completion(entry)
}
public func getTimeline(for configuration: Self.Intent, in context: Self.Context, completion: @escaping (Timeline<Self.Entry>) -> Void) {
let cards: [WidgetCard]? = configuration.cards?.compactMap { card in
let id = card.identifier
let storedCards = SharedStorage.widgetRepository.restore()
return storedCards.first(where: { widgetCard in widgetCard.id == id })
}
let entry = CardListEntry(date: Date(), cards: cards ?? [])
let timeline = Timeline(entries: [entry], policy: .never)
completion(timeline)
}
}
struct CardListEntry: TimelineEntry {
public let date: Date
public let cards: [WidgetCard]
}
ææ¥ãšæéã«å¿ããŠã«ãŒããéžæããããã®èªåã¢ã«ãŽãªãºã ã䜿çšããå Žåã¯ãããæè»ãªãªãã·ã§ã³ã圹ç«ã¡ãŸãã
ãããšã¯å¥ã«ããŠã£ãžã§ããããŠã£ãžã§ããã®ã¹ã¿ãã¯ïŒã¹ããŒãã¹ã¿ãã¯ïŒã«ããå Žåã¯ããŠã£ãžã§ããã®è¡šç€ºã«æ³šæãã䟡å€ããããŸãããã®å Žåã2ã€ã®ãªãã·ã§ã³ã䜿çšããŠåªå 床ã管çã§ããŸããSiriSuggestionsããŸãã¯TimelineEntryRelevanceã¿ã€ãã§TimelineEntryã®é¢é£æ§å€ãèšå®ããããšã§ããTimelineEntryRelevanceã¯äºã€ã®ãã©ã¡ãŒã¿å«ãŸïŒã¹ã³ã¢-ä»ã®ã¹ãããã·ã§ããã«çŸåšã®ã¹ãããã·ã§ããã®çžå¯Ÿçãªåªå 床ããæéã¯ããŠã£ãžã§ãããé¢é£æ§ãä¿ã¡ãã·ã¹ãã ããŠã£ãžã§ãããã¹ã¿ãã¯ã®æäžäœã«é 眮ã§ããããã«ãªããŸã§ã®æéã§ãã
äž¡æ¹ã®æ¹æ³ãããã³ãŠã£ãžã§ããã®æ§æãªãã·ã§ã³ã«ã€ããŠã¯ãWWDCã»ãã·ã§ã³ã§è©³çŽ°ã«èª¬æãããŸããã
ãŸããæ¥ä»ãšæå»ã®è¡šç€ºãææ°ã«ä¿ã€æ¹æ³ã«ã€ããŠã話ãå¿ èŠããããŸãããŠã£ãžã§ããã®ã³ã³ãã³ããå®æçã«æŽæ°ã§ããªããããããã¹ãã³ã³ããŒãã³ãã«ããã€ãã®ã¹ã¿ã€ã«ãè¿œå ãããŸãããã¹ã¿ã€ã«ã䜿çšããå ŽåããŠã£ãžã§ãããç»é¢ã«è¡šç€ºãããŠããéãã·ã¹ãã ã¯ã³ã³ããŒãã³ãã®ã³ã³ãã³ããèªåçã«æŽæ°ããŸããããããå°æ¥çã«ã¯ãåãã¢ãããŒããä»ã®SwiftUIã³ã³ããŒãã³ãã«ãæ¡åŒµãããã§ãããã
ããã¹ãã¯æ¬¡ã®ã¹ã¿ã€ã«ããµããŒãããŸãïŒ
çžå¯Ÿ-çŸåšã®æ¥ä»ãšæå®ãããæ¥ä»ã®æéå·®ãããã§æ³šç®ã«å€ããã®ã¯ãæ¥ä»ãå°æ¥æå®ãããŠããå Žåãã«ãŠã³ãããŠã³ãéå§ããããã®åŸããŒãã«éããç¬éããã®æ¥ä»ã衚瀺ãããããšã§ãã次ã®2ã€ã®ã¹ã¿ã€ã«ã§ãåãåäœãè¡ãããŸãã
ãªãã»ãã-åã®ãã®ãšåæ§ã§ããã±ã®æ¥é èŸã®åœ¢åŒã§ç€ºãããŸãã
ã¿ã€ããŒ-ã¿ã€ããŒã®ã¢ããã°ã
æ¥ä»-æ¥ä»è¡šç€º;
æé-æé衚瀺ã
ãŸããééãæå®ããã ãã§ãæ¥ä»éã®æéééã衚瀺ããããšãã§ããŸãã
let components = DateComponents(minute: 10, second: 0)
let futureDate = Calendar.current.date(byAdding: components, to: Date())!
VStack {
Text(futureDate, style: .relative)
.multilineTextAlignment(.center)
Text(futureDate, style: .offset)
.multilineTextAlignment(.center)
Text(futureDate, style: .timer)
.multilineTextAlignment(.center)
Text(Date(), style: .date)
.multilineTextAlignment(.center)
Text(Date(), style: .time)
.multilineTextAlignment(.center)
Text(Date() ... futureDate)
.multilineTextAlignment(.center)
}
ãŠã£ãžã§ããã®ãã¬ãã¥ãŒ
åããŠè¡šç€ºããããšããŠã£ãžã§ããã¯ãã¬ãã¥ãŒã¢ãŒãã§éãããŸãããã®ããããã¬ãŒã¹ãã«ããŒïŒ:)ã¡ãœããã§TimeLineEntryãè¿ãå¿ èŠããããŸããç§ãã¡ã®å Žåã次ã®ããã«ãªããŸãã
func placeholder(in context: Context) -> Self.Entry {
return CardListEntry(date: Date(), cards: testData)
}
ãã®åŸããã¬ãŒã¹ãã«ããŒãã©ã¡ãŒã¿ãæã€ç·šéæžã¿ïŒçç±:)修食åããã¥ãŒã«é©çšãããŸãããã®å ŽåããŠã£ãžã§ããã®èŠçŽ ã¯ãŒãããŠè¡šç€ºãããŸããæªç·šéã®ïŒïŒä¿®é£Ÿå ã䜿çšããããšã§ãäžéšã®èŠçŽ ãããã®å¹æãåãé€ãããšãã§ããŸããããã¥ã¡ã³ããã®åŒã³åºããšèšãã§:)ãã¬ãŒã¹ãã«ãïŒã¡ãœãããåæããŠãããšãçµæã¯éã£ãŠãå¯èœãªéãè¿ éã«è¿ãå¿ èŠããããŸãå®äº:)ïŒäžïŒgetSnapshotãšã§ïŒgetTimelineïŒå®äº:)
äžžãèŠçŽ
ã¬ã€ãã©ã€ã³ã§ã¯ãèŠçŽ ã®äžžãããŠã£ãžã§ããã®äžžããšäžèŽãããããšããå§ãããŸãããã®ããã«ãContainerRelativeShapeæ§é ãiOS 14ã§è¿œå ãããŸãããããã«ãããã³ã³ãããŒã®åœ¢ç¶ããã¥ãŒã«é©çšã§ããŸãã
.clipShape(ContainerRelativeShape())
Objective-Cã®ãµããŒã
ãŠã£ãžã§ããã«Objective-Cã³ãŒããè¿œå ããå¿ èŠãããå ŽåïŒããšãã°ãããŒã³ãŒãã€ã¡ãŒãžã®çæããŠã£ãžã§ããã«æžã蟌ãã å ŽåïŒãObjective-CããªããžããããŒãè¿œå ããããšã«ããããã¹ãŠãæšæºçãªæ¹æ³ã§è¡ãããŸããç§ãã¡ãééããå¯äžã®åé¡ã¯ããã«ãæã«Xcodeãèªåçæãããã€ã³ãã³ããã¡ã€ã«ã衚瀺ããªããªã£ããããããããããªããžããããŒã«è¿œå ããããšã§ãã
#import "DynamicCardSelectionIntent.h"
#import "CardSelectionIntent.h"
#import "DynamicMultiSelectionIntent.h"
ã¢ããªã±ãŒã·ã§ã³ãµã€ãº
ãã¹ãã¯Xcode12ããŒã¿6ã§å®è¡ãããŸã
ãããŠã£ãžã§ãããªãïŒ61.6 MB
ãŠã£ãžã§ããããïŒ62.2MB
ãã®èšäºã§èª¬æããäž»ãªãã€ã³ããèŠçŽããŸãã
- ãŠã£ãžã§ããã¯ãå®éã«SwiftUIã®æ觊ãã€ããã®ã«æé©ãªæ¹æ³ã§ãããµããŒããããŠããæå°ããŒãžã§ã³ãiOS14ãããäœãå Žåã§ãããããããããžã§ã¯ãã«è¿œå ããŸãã
- WidgetBundleã¯ã䜿çšå¯èœãªãŠã£ãžã§ããã®æ°ãå¢ããããã«äœ¿çšãããŸããããã¯ãApolloRedditã«ããããŸããŸãªãŠã£ãžã§ããã®æ°ã®è¯ãäŸã§ãã
- IntentConfigurationãŸãã¯StaticConfigurationã¯ãã«ã¹ã¿ã èšå®ãå¿ èŠãªãå Žåã«ãŠã£ãžã§ããèªäœã«ã«ã¹ã¿ã èšå®ãè¿œå ããã®ã«åœ¹ç«ã¡ãŸãã
- å ±æã¢ããªã°ã«ãŒãå ã®ãã¡ã€ã«ã·ã¹ãã äžã®å ±æãã©ã«ãã¯ãããŒã¿ãã¡ã€ã³ã¢ããªã±ãŒã·ã§ã³ãšåæããã®ã«åœ¹ç«ã¡ãŸãã
- éçºè ã¯ãã¿ã€ã ã©ã€ã³ãæŽæ°ããããã®ããã€ãã®ããªã·ãŒããéžæã§ããŸãïŒatEndãneverãafterïŒ_ :)ïŒã
ããã«é¢ããŠãXcodeã®ããŒã¿çã§ãŠã£ãžã§ãããéçºãããšããåä»ãªéã¯å®å šã§ãããšèŠãªãããšãã§ããŸããããš1ã€ã®ç°¡åãªã¹ãããããããŸã-AppStoreã§ã¬ãã¥ãŒãè¡ãããšã§ãã
PSãŠã£ãžã§ããä»ãã®ããŒãžã§ã³ã¯ã¢ãã¬ãŒããééããAppStoreããããŠã³ããŒãã§ããããã«ãªããŸããã
æåŸãŸã§ãèªã¿ããã ãããããšãããããŸããææ¡ãã³ã¡ã³ãããåŸ ã¡ããŠãããŸããç°¡åãªã¢ã³ã±ãŒãã«çããŠããŠãŒã¶ãŒãšéçºè ã®éã§ãŠã£ãžã§ãããã©ãã»ã©äººæ°ãââãããã確èªããŠãã ããã