【问题标题】:Share data between main App and Widget in SwiftUI for iOS 14在 iOS 14 的 SwiftUI 中,在主 App 和 Widget 之间共享数据
【发布时间】:2021-01-03 09:39:31
【问题描述】:
@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


    【解决方案1】:

    您可以为您的小部件和应用程序添加 AppGroup 功能(here 是一个很好的说明如何添加它)。


    用户默认值

    代替

    UserDefaults.standard
    

    只需为您的 AppGroup 使用共享的 UserDefaults:

    UserDefaults(suiteName: <your_app_group>)
    

    然后您可以像this answer 中解释的那样读取/写入数据。

    文件容器

    通过 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 repository,其中包含不同的 Widget 示例,包括 App Group Widget。

    【讨论】:

    • 你能告诉我把代码放在哪里(共享 CoreData 容器)。如果可以的话,请分享一个代码 sn-p 显示小部件中的获取部分。
    • @umayanga 这里实际上没有任何特定于 Widget 的内容。您以与标准应用程序相同的方式创建持久容器(您只需明确指定 sqlite 文件的位置)。这同样适用于获取部分。您从持久容器访问上下文并使用它执行获取请求。但由于这仍然可能令人困惑,我在您的帖子下添加了更详细的解释。
    【解决方案2】:

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

    UserDefaults(suiteName: "YOUR_APP_GROUP_NAME")
    

    而不是使用访问它 UserDefaults.standard.

    This article 更全面地描述了这个过程的细节。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-08-29
      • 1970-01-01
      • 2015-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多