17
@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.")
    }
}

如何从我的主应用程序获取数据到小部件?

4

2 回答 2

38

您可以为您的 Widget 和 App添加AppGroup功能(这里是一个很好的解释如何添加它)。


用户默认值

代替

UserDefaults.standard

只需UserDefaults为您的 AppGroup 使用 shared :

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 存储库,其中包含不同的 Widget 示例,包括 App Group Widget。

于 2020-09-16T17:20:32.153 回答
0

一种简单的方法是将应用程序和小部件添加到同一个应用程序组,然后从位于该应用程序组容器中的 UserDefaults 存储而不是应用程序的默认 UserDefaults 存储中存储和检索数据。您可以通过使用初始化 UserDefaults 来访问您的应用程序组的共享存储

UserDefaults(suiteName: "YOUR_APP_GROUP_NAME")

而不是使用 UserDefaults.standard.

本文对这个过程的细节进行了更全面的描述。

于 2021-02-05T00:20:02.877 回答