在 WidgetKit 的应用程序组上存储一个数组

Posted

技术标签:

【中文标题】在 WidgetKit 的应用程序组上存储一个数组【英文标题】:Store an array on the app group for WidgetKit 【发布时间】:2020-10-06 19:31:36 【问题描述】:

我正在尝试将结构数组存储到应用程序组容器中,以便稍后在小部件上使用它。 假设,我有一个字符串数组

let = array = ["object1", "object2", "object3"]

我在这里看到我可以访问应用程序组容器 url

let applicationGroupId = "group.com.development.widget"
            
guard let groupURL = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: applicationGroupId) else 
    fatalError("could not get shared app group directory.")

现在,我需要知道如何将这个数组存储在应用组中,以及如何在 Widgetkit SwiftUI 类中读取它

您的帮助将不胜感激。

【问题讨论】:

见Share data between main App and Widget in SwiftUI for ios 14和how to save and read array of array in NSUserdefaults in swift? 【参考方案1】:

签名、能力、权利

现在应该可以在 Xcode (12+) 中完成所有这些工作。在应用程序的项目设置中,转到“签名和功能”选项卡,并确保自动管理签名已启用,并且团队拥有有效的开发团队(公司或个人帐户)。

点击左上角的 + Capability 按钮进入 App Group Capability(这也会添加一个权利文件)。现在您将找到一个 App Group 部分。点击 App Groups 的 + 按钮并输入一个全局唯一标识符(类似于 group.<appid>)。这将在开发者平台上创建应用组并将其添加到应用的配置文件和权利中。

您必须对所有目标(应用目标、小部件扩展目标和(可选)意图目标)重复相同的步骤并使用相同的应用组。如果您点击其他目标应用程序组的重新加载按钮,它应该会自动显示您之前注册的应用程序组,您可以选中该复选框。如果没有,点击 + 并使用相同的 id 应该也可以。

最后,检查所有权利文件并确保它们在应用组中具有相同的字符串(复制和粘贴只是为了确保)。

代码

在代码中,您现在只需使用选定的应用组suitName 访问用户默认值。为了测试一切是否设置正确,我会在application(_:didFinishLaunchingWithOptions) 中加入以下行:

UserDefaults(suiteName: "group.id.test")!.setValue(["object1", "object2", "object3"], forKey: "test")

在 Widget 中尝试将其放在 Text 视图中:

struct WidgetTestEntryView : View 
  var entry: Provider.Entry
  var text: String 
      (UserDefaults(suiteName: "group.id.test")!.value(forKey: "test") as? [String])?.joined(separator: " ") ?? "Nothing stored yet"
  

  var body: some View 
    Text(text)
  

注意:我故意强制解包用户默认设置以提前失败并检查功能/签名设置是否有效。在生产中,您应该防范失败。

替代存储

正如您所指出的,也可以通过写入FileManager.default.containerURL(forSecurityApplicationGroupIdentifier:) 提供的 url 将数据保存在共享容器中,但我认为您的简单示例不需要它。如果您想共享比StringIntArray ... 更复杂的数据,请确保将其转换为Data,因为用户默认无法处理任意数据(即使它是Codable)。

手动签名

如果您使用手动签名,则只需在开发者控制台中执行相同的步骤,从注册应用组开始。之后,将该组添加到所有标识符的功能并重新创建所有配置文件。从那里您应该使用与上述类似的步骤。

【讨论】:

以上是关于在 WidgetKit 的应用程序组上存储一个数组的主要内容,如果未能解决你的问题,请参考以下文章

仅限于 WidgetKit 时间线条目?

如何在每个组上应用功能并保持相同形状的数据框

我无法从 widgetKit 扩展上的应用程序中检索 xcdatamodeld 数据

当资源组上有删除锁时,如何使用 Powershell 停止 Azure 数据工厂的存储事件触发器?

Joomla 3 Widgetkit 未显示在组件菜单中

如果正在使用我的小部件,如何查询 WidgetKit?