日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

中点击按钮新建widget_iOS 14-Widget开发

發布時間:2023/12/15 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 中点击按钮新建widget_iOS 14-Widget开发 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Widget 類似一個迷你版的 App,可以快速訪問 App 提供的信息—比如天氣、事件、筆記等。Widget 還可以充當“快捷方式”,點擊它會立即跳轉到 App 的指定位置。

介紹

  • WidgetKit 通過在 iOS 主屏幕或 macOS 通知中心放置小部件,讓用戶可以隨時訪問 App 中的內容。Widget 可以保持更新,從而讓用戶獲得最新信息。當需要查看 App 的更多細節時,Widget 會直接跳轉到 App 中的適當位置。
  • Widget 有三種不同的尺寸(小號、中號和大號),可以對 Widget 進行個性化定制。
  • 要實現一個 Widget,需要給應用添加一個 Widget 擴展并只能使用 SwiftUI 來實現 Widget 的內容。

App實現

Widget 寄宿于 App,所以首先必須將 App 功能實現。

添加Widget

  • 點擊項目,選擇File > New > Target。
  • 從Application Extension中,選擇Widget Extension,然后點擊Next。
  • 輸入擴展名的名稱。
  • 單擊Finish。
  • 此時會生成一個新文件夾,包含以下內容
    • 擴展名.swift
    • 擴展名.intentdefinition
    • Assets.xcassets
    • Info.plist

    數據共享

    App 與 Widget 可以通過網絡數據和本地數據兩種方式進行數據的共享。

    • 網絡數據可通過 URLSession 完成數據的請求與解析。
    • 本地數據共享可以通過 App Groups,它是 iOS 8 之后推出的在 App 之間共享數據的方式,只需要簡單的配置就可以實現數據的共享。(本文以此為例)

    配置

  • App 在Signing&Capabilities中打開App Groups,內容一般為group.Bundle Identifier。
  • Widget 必須在Signing&Capabilities中打開App Groups,內容與 App 保持一致。
  • 如果文件需要共享,可以選中 App 中需要共享給 Widget 的文件,然后勾選 Widget 的 Target。[563513413](正在跳轉),不管你是大牛還是小白都歡迎入駐

    實現

    配置完成以后,可以通過UserDefaults或FileManager來實現 App 與 Widget 的數據共享,這里以UserDefaults為例,因為 SwiftUI 提供了@AppStorage來簡化操作。

    • App
    // 包含App Groups的UserDefaults @AppStorage("contact", store: UserDefaults(suiteName: "group.cn.abc.yf.SwiftUI-Widget"))// 然后在后面保存數據
    • Widget
    @AppStorage("contact", store: UserDefaults(suiteName: "group.cn.abc.yf.SwiftUI-Widget"))// 然后在后面取出數據

    編寫Widget

  • 原理:開發者通過 SwiftUI 構建 Views,定義Timelines為 Views 提供對應時間所需的數據,當數據變化時,通過reload更新數據。TimelineProvider提供一組TimelineEntry和ReloadPolicy,用來后續刷新頁面。
  • 實現 Widget 的代碼相對比較模版,可以從 Widget 的入口開始,缺什么補什么。
  • 入口

    @main struct UserWidget: Widget {private let kind: String = "UserWidget"public var body: some WidgetConfiguration {} }
    • kind:字符串,唯一標識 Widget。
    • WidgetConfiguration:有兩類配置,分別為
      • StaticConfiguration : 可以在不需要用戶任何輸入的情況下自行解析,可以在 Widget 的 App 中獲取相關數據并發送給 Widget。
      • IntentConfiguration:依賴于 App 的 Siri Intent,會自動接收這些 Intent 并用于更新 Widget,用于構建動態 Widget。
    • .supportedFamilies:支持不同尺寸。

    內容

    不論是哪種配置,都需要提供以下內容。

    Entry

    渲染 Widget 所需的數據模型,需要遵守TimelineEntry協議。

    struct Model: TimelineEntry {let date: Date// 顯示的內容Model }

    Provider

    遵守TimelineProvider協議,告訴 WidgetKit 何時渲染與刷新 Widget。需要實現以下 3 個方法:

    struct Provider: TimelineProvider {// 占位視圖,是一個標準的 SwiftUI View,當第一次展示或者發生錯誤時都會展示該 View。func placeholder(in context: Context) -> TimelineEntry {}// 編輯屏幕在左上角選擇添加Widget、第一次展示時會調用該方法func getSnapshot(in context: Context, completion: @escaping (TimelineEntry) -> Void) {}// 進行數據的預處理,轉化成Entry// 最后一定要調用 completion,進而刷新Widgetfunc getTimeline(in context: Context, completion: @escaping (Timeline<TimelineEntry>) -> Void) {} }
  • getTimeline 是最重要的方法,后面的數據刷新都會在其中完成,所以可能會在其中完成最新的網絡數據和本地數據的獲取,然后轉成 Model 以供使用。
  • getTimeline 的方法里有一個 policy 參數,表示刷新的時機,可以選擇.never(不刷新),.atEnd(Entry 顯示完畢之后自動刷新) 或 .after(date)(到達某個特定時間后自動刷新)。
  • Widget 刷新的時間由系統統一決定(有時候設置了也不會自己刷新),如果需要強制刷新 Widget,可以在 App 中使用 WidgetCenter 來重新加載所有時間線:WidgetCenter.shared.reloadAllTimelines()。
  • EntryView

    屏幕上 Widget 顯示的內容,可以針對不同尺寸的 Widget 設置不同的 View。

    struct EntryView: View {var entry: Provider.Entry // 數據模型@Environment(.widgetFamily) var family // 尺寸環境變量@ViewBuildervar body: some View {switch family {case .systemSmall:// 小尺寸case .systemMedium:// 中尺寸default:// 大尺寸}} }
  • Widget 能且只能使用 SwiftUI 構建界面。
  • Widget 本質:一個隨著時間線而更新的 SwiftUI View。
  • 運行

    • 先運行 App
    • 再運行 Widget

    交互

    只能點擊,點擊會打開 App。也可以通過.widgetURL(myDeeplink)方法配置當 Widget 被點擊時觸發哪個 Deep Linking,也可以通過使用鏈接使 Widget 的不同部分觸發不同的 Deep Linking(可以直接理解為 Widget 只是一個按鈕,點按這個按鈕會跳轉到指定 URL 對應的頁面)。

    • Widget點擊
    // 某個Widget內容 var body: some View {VStack {Link(destination: homeDeepLink) {Text("主頁")}Link(destination: settingsDeepLink) {Text("設置")}}.widgetURL(myDeeplink) }
    • App處理
    @main struct SwiftUIApp: App {var body: some Scene {WindowGroup {ContentView().onOpenURL(perform: { url inprint(url)})}} }

    源代碼

    創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

    總結

    以上是生活随笔為你收集整理的中点击按钮新建widget_iOS 14-Widget开发的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。