gpt4 book ai didi

ios-app-group - 在 WidgetKit 的应用程序组上存储一个数组

转载 作者:行者123 更新时间:2023-12-05 07:00:00 24 4
gpt4 key购买 nike

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

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 类中读取它

我们将不胜感激。

最佳答案

签名、能力、权利

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

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

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

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

代码

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

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

在 Widget 中,只需尝试将其置于 TextView 中:

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 将数据保存在共享容器中。但我认为您的简单示例不需要它。如果您想共享比 String 更复杂的数据, Int , Array ...确保将其转换为 Data因为用户默认值无法处理任意数据(即使它是 Codable )。

手动签名

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

关于ios-app-group - 在 WidgetKit 的应用程序组上存储一个数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64232616/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com