@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.")
}
}
如何将数据从主应用程序获取到小部件?
您可以为Widget和应用程序添加AppGroup功能(这里有一个很好的解释如何添加它(。
用户默认值
代替
UserDefaults.standard
只需为您的AppGroup:使用共享UserDefaults
UserDefaults(suiteName: <your_app_group>)
然后你就可以像这个答案中解释的那样读/写数据了。
文件容器
使用AppGroup权限,您可以访问共享文件容器:
let containerURL = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: <your_app_group>)!
并访问这样的url:
let someFileURL = containerURL.appendingPathComponent("SomeFile.txt")
然后你可以使用你的共享文件容器,就像这个答案中解释的那样:
- 如何读取iOS WidgetKit应用程序创建的文件
核心数据
您也可以创建一个共享的CoreData容器:
let storeURL = containerURL.appendingPathComponent("DataModel.sqlite")
let description = NSPersistentStoreDescription(url: storeURL)
let container = NSPersistentContainer(name: "DataModel")
container.persistentStoreDescriptions = [description]
container.loadPersistentStores { ... }
然后,您可以使用共享的CoreData容器,如以下答案所述:
- 从适用于iOS 14的CoreData小部件获取数据
这是一个GitHub存储库,包含不同的Widget示例,包括App Group Widget
一种简单的方法是将应用程序和小部件添加到同一个应用程序组,然后从位于该应用程序组容器中的UserDefaults存储中存储和检索数据,而不是从应用程序的默认UserDefaults存储中存储数据。您可以通过使用初始化UserDefaults来访问应用程序组的共享存储
UserDefaults(suiteName: "YOUR_APP_GROUP_NAME")
而不是使用CCD_ 2。
本文对这个过程的细节进行了更全面的描述。