在 SwiftUI 中主 App 和 Widget 之间共享数据

问题描述 投票:0回答:2
@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.")
    }
}

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

swift swiftui widget ios14 widgetkit
2个回答
60
投票

您可以为您的小组件和应用程序添加 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 存储库,其中包含不同的小部件示例,包括应用程序组小部件。


2
投票

执行此操作的一种简单方法是将应用程序和小部件添加到同一应用程序组,然后从位于该应用程序组容器中的 UserDefaults 存储(而不是应用程序的默认 UserDefaults 存储)存储和检索数据。 您可以通过使用

初始化 UserDefaults 来访问您的应用程序组的共享存储
UserDefaults(suiteName: "YOUR_APP_GROUP_NAME")

而不是使用访问它

UserDefaults.standard

本文更全面地描述了此过程的细节。

© www.soinside.com 2019 - 2024. All rights reserved.