2020年06月22日的WWDC上iOS14的新特性-小部件正式在iOS上線,同時WidgetKit也正式面向廣大開發者使用。git
也正是由於對Android的小部件有所瞭解,故想嘗試下iOS的小部件的開發,而且發現當前並無相關的文章,故記錄下我學習WigetKit的經歷,如下均爲本身學習路上的經歷,可能會有些問題,還望大佬指正。github
同時已把學習路上寫的代碼開源 - iWiget,看完這篇文章認爲有用就點個Star唄!api
項目地址: github.com/Littleor/iW…bash
前面幾期的連接:markdown
小部件用戶配置界面不須要咱們本身去寫了,WidgetKit已經爲咱們作好了,咱們須要的只是添加一個SiriIntent來獲取咱們須要的數據便可,而後Widgetkit會自動生成對應的配置界面,用戶只須要長按小部件後點擊Edit Widget便可配置Widget的數據了。工具
左上角導航選擇File->New->File而後找到Siri Intent Definition File以後添加到WidgetExtension中便可。 oop
這裏的配置須要根據你對Widget須要的數據來配置post
打開Siri Intent Definition File後因爲是新建的文件應該是空的,這個時候先在導航欄找到Editor添加Intent
添加完成以後應該是這樣的
而後在對Intent進行配置
注意不是對Response配置哦!
注意Target要選擇到Widget Extensive哦!
目前Xcode12-beta有bug,須要重啓Xcode以後纔會顯示配置項!
目前Xcode12-beta有bug,須要重啓Xcode以後纔會顯示配置項!
目前Xcode12-beta有bug,須要重啓Xcode以後纔會顯示配置項!
其中type必須換成View而後Title換成本身的命名(後面會用到這個Intent) Parameter中添加你須要用戶輸入的內容便可,這裏使用content作個示範(String類型).
打開Swift文件,把Widget內容替換爲Intent
public var body: some WidgetConfiguration { IntentConfiguration(kind: kind, intent: ConfigurationIntent.self, provider: Provider(), placeholder: PlaceholderView()) { entry in WidgetDemoEntryView(entry: entry) } .configurationDisplayName("My Widget") .description("This is an example widget.") } 複製代碼
再將Provider類型換爲IntentTimelineProvider:
下面是Xcode自動生成的代碼 不少不必的 主要是改成IntentTimelineProvider
struct Provider: IntentTimelineProvider { public func snapshot(for configuration: ConfigurationIntent, with context: Context, completion: @escaping (SimpleEntry) -> ()) { let entry = SimpleEntry(date: Date(), configuration: configuration) completion(entry) } public func timeline(for configuration: ConfigurationIntent, with context: Context, completion: @escaping (Timeline<Entry>) -> ()) { var entries: [SimpleEntry] = [] // Generate a timeline consisting of five entries an hour apart, starting from the current date. let currentDate = Date() for hourOffset in 0 ..< 5 { let entryDate = Calendar.current.date(byAdding: .hour, value: hourOffset, to: currentDate)! let entry = SimpleEntry(date: entryDate, configuration: configuration) entries.append(entry) } let timeline = Timeline(entries: entries, policy: .atEnd) completion(timeline) } } 複製代碼
再在view中顯示內容:
struct DemoWidgetEntryView : View { var entry: Provider.Entry var body: some View { Text(entry.content == nil ? "PlaceHolder" : entry.content!) } } 複製代碼
iOS的Widgetkit對於用戶配置的開發實在太友好了,只須要使用Xcode提供的可視化工具添加參數便可生成配置界面,方便快捷,UI統一。
相比Andorid使用指定的設置Fragment來說,方便快捷多了。
對於小部件的配置Widgetkit已經直接封裝到了Intent的參數中,只須要添加後在Entry中使用便可。
這一次大概整理了下Widget添加用戶配置界面的大概過程,還有小部件點擊交互操做下次再分享,敬請期待。
完整代碼見GitHub
後續還會慢慢完善WidgetKit開發的文章,同時iWiget也會不斷完善,這篇文章對你有用就點個Star吧!
項目地址: github.com/Littleor/iW…