iOS 14開發(fā) Widget小組件

詳細(xì)介紹小組件的內(nèi)容已經(jīng)有很多了。我就不再多費事了。現(xiàn)在將一些內(nèi)容總結(jié)在本文中。
更新:根據(jù)資料我自己寫了一套完整的14開發(fā) Widget小組件介紹
iOS 14 Widget小組件

一、資料

  1. 以下資料對于從零開始搭建一個實戰(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ù)刷新間隔問題
  2. 以下資料可以了解一些App Widget 的更新機制、渲染機制問題。
    對于可配置的Widget組件也有介紹
    iOS14新特性探索之二:App Widget小組件應(yīng)用

二、爬坑

  1. 與主App交互
  1. 創(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ù)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容