iOS 14 Apple 推出了 WidgetKit,Widget 就像一个迷你版的 App,可以快速访问它所提供的信息—比如天气、日历事件、笔记等。 介绍 WidgetKit 通过在 iOS 主屏幕或 macOS 通知中心放置小部件,让用户可以随时访问 App 中的内容。Widget 可以保持更新,从而让用户获得最新信息。 struct Model: TimelineEntry { public let date: Date // 模型结构体 } Provider 遵守TimelineProvider协议,告诉 WidgetKit
在 iOS 14 正式版发布之前我写了一篇博文《iOS开发之WidgetKit》,iOS 14 正式版发布以后,经测试,Apple 改变了 Widget 的 API,所以本文进行一个补充说明(在前文的基础上做了修改 介绍 WidgetKit 通过在 iOS 主屏幕或 macOS 通知中心放置小部件,让用户可以随时访问 App 中的内容。Widget 可以保持更新,从而让用户获得最新信息。 struct Model: TimelineEntry { let date: Date // 显示的内容Model } Provider 遵守TimelineProvider协议,告诉 WidgetKit
当系统的 WidgetKit 调用 Reload Timeline API 之后,会要求 Widget Extension 的 Timeline Provider 提供一组 TimelineEntry 值得一提的是,WidgetKit 会把 Timelines 所定义的 Entries 对应的 Views 结构信息缓存到磁盘,然后在刷新的时候才通过 JIT 的方式来渲染。 /creating-a-widget-extension Building Widgets Using WidgetKit and SwiftUI https://developer.apple.com /documentation/widgetkit/building_widgets_using_widgetkit_and_swiftui Making a Configurable Widget https https://developer.apple.com/documentation/widgetkit/keeping-a-widget-up-to-date
TimelineEntry 标识您希望 WidgetKit 更新 Widget 内容的日期,包括 Widget 视图需要渲染自定义类型的属性。 •Placeholder View:WidgetKit 使用一个 SwiftUI 视图来首次渲染。占位符是 Widget 的通用表示形式,没有特定的配置或数据。 当 isPreview 为 true 时,Widget 将在 WidgetKit 库中显示。作为响应,您需要快速创建预览快照。 时间轴由一个或多个时间轴条目以及一个重载策略组成,该重载策略通知 WidgetKit 何时请求后续时间轴。 在呈现 Widget 的内容时,WidgetKit 会忽略交互式元素。
小组件概述 WidgetKit 通过在 iOS 主屏幕或 macOS 通知中心放置小组件,让用户可以随时访问 App 中的内容。Widget 可以保持更新,从而让用户获得最新信息。 时间线提供者告诉WidgetKit何时更新您的窗口小部件的内容。 ?
大纲 系统如何管理小组件刷新 Timeline刷新机制 Timeline刷新机制代码实现 刷新策略建议 时钟刷新策略(只有小时分钟,没有秒) 主动请求重新刷新 系统如何管理小组件刷新 WidgetKit 在一个单独的进程中渲染小组件视图 即使小组件窗口显示在屏幕上,widget extension 也不会持续处于活动状态 为了管理系统负载,WidgetKit使用预算来分配一天中的窗口小组件重载 WidgetKit WidgetKit可能会在多个窗口小组件之间合并重新加载,从而影响窗口小组件重新加载的确切时间。 Timeline刷新机制 ? 该图显示了WidgetKit请求时间线,提供程序生成时间线以及3小时后的时间进度,之后WidgetKit请求新的时间线 ? 该图显示了WidgetKit请求时间线,提供程序生成时间线以及WidgetKit在2小时后请求新时间线的图 Timeline刷新机制代码实现(新增组件时,系统默认就实现了) func getTimeline
import WidgetKit import SwiftUI @main struct UserSportsBundle: WidgetBundle { var body: some Widget import ActivityKit import SwiftUI import WidgetKit // MARK:- ActivityAttributes,需要共享给App与Widget struct
swift文件里刷新 import WidgetKit // 导入WidgetKit WidgetCenter.shared.reloadAllTimelines() // 刷新所有的widget WidgetCenter.shared.reloadTimelines import WidgetKit @objc @available(iOS 14.0, *) class WWWidgetManager: NSObject { @objc static let
当用户编辑窗口小部件时,WidgetKit会加载"Intens Extension"以提供动态信息。 // // WidgetConfigIntent.swift // WidgetConfigIntent // import WidgetKit import SwiftUI import Intents
label: () -> Label ) } 案例 效果 效果图.gif 实现 import AppIntents import Foundation import SwiftUI import WidgetKit
Widget开发使用苹果新推出的WidgetKit,UI开发只能使用SwiftUI,而Today Extension则使用UIKit。 (实测本地模拟器环境可超过5种,实际发布上线未验证) 5.2 不是所有的SwiftUI组件都可用 WidgetKit限制Widget UI需由SwiftUI实现,但并不是所有SwiftUI的组件都可供Widget 如果遇到不支持的组件,WidgetKit渲染时会忽略。 具体可使用的组件参见官方文档。
是的,从 watchOS 9 开始,你还可以用 WidgetKit 去实现 watchOS 的复杂性。
Configuration Intent”,默认生成如下代码,这里新建的时候小组件的名字是 “Widget1” // // Widget1.swift // Widget1 // import WidgetKit
// // WidgetConfigIntent.swift // WidgetConfigIntent // import WidgetKit import SwiftUI import Intents
布局就讲这么多,入个门差不多了,另外,小组件并不能使用全部的SwiftUI控件,只能使用一些基本的控件,更多详情可以查看官网 https://developer.apple.com/documentation/widgetkit
从这张图中可以更容易地看出每种编程语言的演变: 使用各种编程语言的二进制文件数量 WidgetKit 小部件和 Objective-C 在查看数据以确保它们有意义时,我惊讶地发现所有使用 WidgetKit
讨论状态初始化器中的 UUID[11] 讨论对于金融计算用 Decimal 还是 Double[12] 推荐博文 在 SwiftUI 中开发灵动岛[13] 摘要: 本文将详细介绍使用 WidgetKit
创建好Tatget后,模版自带3个文件,其中LiveWidgetLiveActivity中实时活动的核心框架代码,我们做些简单的修改,如下: import ActivityKit import WidgetKit
BGAppRefreshTask) } } } // WeatherWidget.swift - Widget实现 import WidgetKit import SwiftUI
APP的交互:https://my.oschina.net/u/2340880/blog/711807 需要注意,在iOS 14中,Today Extension相关的接口都已经被废弃,我们需要使用新的WidgetKit