詳細(xì)介紹小組件的內(nèi)容已經(jīng)有很多了。我就不再多費事了。現(xiàn)在將一些內(nèi)容總結(jié)在本文中。
更新:根據(jù)資料我自己寫了一套完整的14開發(fā) Widget小組件介紹
iOS 14 Widget小組件
一、資料
- 以下資料對于從零開始搭建一個實戰(zhàn)Widget小組件,有很好的幫助。
按照作者一步一步寫,就能搭起一個有互聯(lián)網(wǎng)請求、圖片請求、與主App交互的小組件
iOS14 Widget小組件開發(fā)實踐1——了解Widget
iOS14 Widget小組件開發(fā)實踐2——自定義Widget
iOS14 Widget小組件開發(fā)實踐3——Widget點擊交互
iOS14 Widget小組件開發(fā)實踐4——用戶屬性配置
iOS14 Widget小組件開發(fā)實踐5——網(wǎng)絡(luò)圖片的加載
iOS14 Widget小組件開發(fā)實踐6——關(guān)于組件數(shù)據(jù)刷新間隔問題 - 以下資料可以了解一些App Widget 的更新機制、渲染機制問題。
對于可配置的Widget組件也有介紹
iOS14新特性探索之二:App Widget小組件應(yīng)用
二、爬坑
- 與主App交互
- 主App傳值到Widget小組件
必須先使用開發(fā)者賬號創(chuàng)建主App與Widget的group,生成groupid:
Widget的group配置
https://blog.csdn.net/songchunmin_/article/details/51316806
可以通過NSUserDefault或NSFileManager進行通信:
主App通過NSUserDefault與WidgetKit傳遞值
主App通過NSUserDefault或NSFileManager與WidgetKit傳遞值
https://blog.csdn.net/qq_38718912/article/details/109092438?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-3&spm=1001.2101.3001.4242 - Widget小組件跳轉(zhuǎn)到主App
iOS14 Widget小組件開發(fā)實踐3——Widget點擊交互
- 創(chuàng)建多個小組件
iOS14 Widget開發(fā)踩坑(二)修正版-多個小組件
https://blog.csdn.net/qq_38718912/article/details/108148736?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-2&spm=1001.2101.3001.4242
三、TimelineProvider補充
1. 概述
在不同的時候,WidgetKit會向提供者請求一個時間表。日程表是符合TimelineEntry的對象數(shù)組。每個日程表條目都有一個日期,您可以指定用于顯示小部件的其他屬性。
WidgetKit通過以下兩種方式之一請求時間線條目:
- 單個即時快照,表示小部件的當(dāng)前狀態(tài)。
- 一個條目數(shù)組,包括小部件狀態(tài)改變的當(dāng)前時刻和任何未來日期(如果已知)。
2. getSnapshot(快照)
WidgetKit在臨時情況下(例如用戶添加小部件時)顯示小部件時發(fā)出快照請求。WidgetKit提供了一個上下文參數(shù),其中包含有關(guān)如何使用條目的詳細(xì)信息,包括它是否是小部件庫的預(yù)覽,以及要顯示的小部件的系列或大小。如果上下文.isPreview如果為true,則小部件將顯示在小部件庫中,并且需要提供商的快速響應(yīng)。如果生成快照所需的信息不可用,或者需要額外的時間來加載,請改用示例數(shù)據(jù)。
3. 時間線設(shè)置
WidgetKit在用戶從小部件庫添加小部件后發(fā)出時間線請求。因為小部件擴展并不總是在運行,所以WidgetKit需要知道何時激活它來更新小部件。當(dāng)您想要更新小部件時,提供者生成的時間線會通知WidgetKit。
如果提供者需要執(zhí)行異步工作來生成時間線,例如從服務(wù)器獲取數(shù)據(jù),請存儲對完成處理程序的引用,并在異步工作完成時調(diào)用它。
4. 確定刷新策略
創(chuàng)建時間線時,提供程序指定一個刷新策略,用于控制WidgetKit何時請求新的時間線。默認(rèn)行為是使用.atEnd在時間線中的條目指定的最后日期之后請求新的時間線。但是,如果WidgetKit請求新時間線的日期不同,則可以將刷新策略指定為.after(date:)。
// 2.5小時后刷新時間線.
let date = Calendar.current.date(byAdding: .minute, value: 150, to: Date())
let timeline = Timeline(entries: entries, policy: .after(date))
completion(timeline)
使用不同日期有意義的其他示例包括:
- 在顯示股票市場詳細(xì)信息的小部件中,您可以指定下一個市場開盤或收盤日期,因為信息通常不會在夜間或周末更改。
- 航班著陸后,航班跟蹤小部件可能會繼續(xù)顯示“航班著陸”指示。在這種情況下,您可以指定一個比航班著陸時間晚的日期,以便在清除之前其狀態(tài)保持可見一段時間。
或者,如果將來的事件不可預(yù)測,可以通過為策略指定.never來告訴WidgetKit根本不請求新的時間線。在這種情況下,當(dāng)新的時間線可用時,應(yīng)用程序調(diào)用WidgetCenter函數(shù)reloadTimelines(ofKind:)。
- 當(dāng)用戶將一個小部件配置為顯示一個角色的健康狀況,但該角色不再積極參與戰(zhàn)斗,并且其健康水平不會改變時。
- 當(dāng)一個小部件的內(nèi)容依賴于用戶登錄到一個帳戶,而他們當(dāng)前沒有登錄時。
在這兩個示例中,當(dāng)應(yīng)用程序確定狀態(tài)已更改時,它調(diào)用WidgetCenter函數(shù)reloadTimelines(ofKind:),WidgetKit請求一個新的時間線。
5. 高效刷新小部件
每個配置的小部件每天接收有限的刷新次數(shù)。有幾個因素會影響小部件接收的刷新次數(shù),例如包含的應(yīng)用程序是在前臺還是后臺運行,小部件在屏幕上顯示的頻率,以及包含的應(yīng)用程序參與的活動類型。
6. 注意
在Xcode中調(diào)試小部件時,WidgetKit不會施加此限制。要驗證小部件的行為是否正確,請在Xcode的調(diào)試器之外測試應(yīng)用程序和小部件的行為。
7. 使用以下方法優(yōu)化小部件刷新:
- 讓包含應(yīng)用程序在小部件需要數(shù)據(jù)之前為小部件準(zhǔn)備數(shù)據(jù)。使用共享組容器存儲數(shù)據(jù)。
- 在應(yīng)用程序中使用后臺處理時間來更新共享數(shù)據(jù)。有關(guān)詳細(xì)信息,請參閱使用后臺應(yīng)用程序刷新更新應(yīng)用程序。
- 如前一節(jié)所述,為顯示的信息選擇最合適的刷新策略。
- 僅當(dāng)小部件當(dāng)前顯示更改的信息時才調(diào)用reloadtimelines(ofkind:)。
當(dāng)你的應(yīng)用程序在前臺,有一個活動的媒體會話(AVAudioSession),或者正在使用標(biāo)準(zhǔn)的位置服務(wù)時,刷新不計入小部件的每日限制。有關(guān)媒體會話和位置服務(wù)的更多信息,請參閱AVAudioSession和使用標(biāo)準(zhǔn)位置服務(wù)。