概述
从 iOS 17(watchOS 11)开始,苹果推出了可交互小组件(Interactive Widgets),使用它我们终于能在 Widgets 中添加按钮或 Toggle 来直接驱动数据的变化了。
但是被 Widgets 修改的数据如何及时的同步到对应 App 的界面中呢?
在本篇博文中,您将学到如下内容:
相信学完本篇之后,小伙伴们对于 SwiftData 数据变化在 Widgets 和 App 界面间的同步处理一定会了然于胸!
那还等什么呢?Let’s go!!!😉
1. 打造 Widgets 和 App 中共享的 ModelContainer 容器
首先,为了能在 Widgets 和 App 里共享同一个持久存储数据库,我们必须采用某种机制让它们“航行在同一片海域”。
对于 Apple 平台来说,最简单的方法是使用 CoreData 或 SwiftData 的组件共享机制。比如,App Groups 或 iCloud。这里,因为我们不需要跨设备同步数据,所以采用 SwiftData + App Groups 的搭档方式。
第一步,我们需要在 Xcode 中为 Target 增加 App Groups Capability,我们还要选择一个以 group. 开头的唯一 Groups ID 名称:
接着,创建一个新的 ModelContainer+ext.swift 源代码文件:
import SwiftData
enum Common {
static let appGroupID = "group.YourAppName.YourName.com"
}
extension ModelContainer {
// 所有需要加入 ModelContainer 容器中的托管数据类型
private static let schema = Schema([
AppModel.self,
TemptingRecord.self,
InternalStorageClock.self,
Settings.self,
])
static var used: ModelContainer = {
ProcessInfo.processInfo.isRunningInPreviews ? .preview : .shared
}()
static var shared: ModelContainer = {
let modelConfiguration = ModelConfiguration(schema: schema, isStoredInMemoryOnly: false, groupContainer: .identifier(Common.appGroupID))
do {
return try ModelContainer(for: schema, configurations: [modelConfiguration])
} catch {
fatalError("Could not create ModelContainer: \(error)")
}
}()
static var preview: