@main
struct ClockWidgetExt: Widget {
private let kind: String = "ClockWidgetExt"
public var body: some WidgetConfiguration {
StaticConfiguration(kind: kind, provider: Provider(), placeholder: PlaceholderView()) { entry in
HomeTestView()
}
.configurationDisplayName("My Widget")
.description("This is an example widget.")
}
}
如何将数据从主应用程序获取到小部件?
您可以为您的小组件和应用程序添加 AppGroup 功能(here 很好地解释了如何添加它)。
而不是
UserDefaults.standard
只需将共享的
UserDefaults
用于您的 AppGroup:
UserDefaults(suiteName: <your_app_group>)
然后您可以按照此答案中的说明读取/写入数据。
通过 AppGroup 权利,您可以访问共享文件容器:
let containerURL = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: <your_app_group>)!
并访问这样的网址:
let someFileURL = containerURL.appendingPathComponent("SomeFile.txt")
然后您可以使用共享文件容器,如本答案中所述:
您也可以创建一个共享的 CoreData 容器:
let storeURL = containerURL.appendingPathComponent("DataModel.sqlite")
let description = NSPersistentStoreDescription(url: storeURL)
let container = NSPersistentContainer(name: "DataModel")
container.persistentStoreDescriptions = [description]
container.loadPersistentStores { ... }
然后您可以使用共享的 CoreData 容器,如本答案中所述:
这里是一个 GitHub 存储库,其中包含不同的小部件示例,包括应用程序组小部件。
执行此操作的一种简单方法是将应用程序和小部件添加到同一应用程序组,然后从位于该应用程序组容器中的 UserDefaults 存储(而不是应用程序的默认 UserDefaults 存储)存储和检索数据。 您可以通过使用
初始化 UserDefaults 来访问您的应用程序组的共享存储UserDefaults(suiteName: "YOUR_APP_GROUP_NAME")
而不是使用访问它
UserDefaults.standard
。
本文更全面地描述了此过程的细节。