SwiftUI 小部件中的 UIKit UserDefaults

Noa*_*ans 5 widget uikit swift swiftui ios14

希望这是一个简单的问题,但我想知道如何从 SwiftUI 小部件访问保存在 UIKit 应用程序中的 UserDefaults 数据?我需要在小部件中显示其中一些数据。

谢谢!

And*_*rew 9

您需要使用UserDefaults(suiteName:)而不是UserDefaults.standard与 AppGroup 一起使用。UserDefaults.standard只能在它所在的应用程序中访问,它不适用于您可能制作的任何扩展程序或其他应用程序。这就是为什么您必须使用 AppGroup。

创建应用程序组后(您可以在“签名和功能”部分中执行此操作),您应该有一个suiteName类似的应用程序组:

group.com.my.app.identifier
Run Code Online (Sandbox Code Playgroud)

然后,在应用程序的 UIKit 部分中,您可以按以下方式设置 AppGroup 的 UserDefaults 中的值:

if let userDefaults = UserDefaults(suiteName: "group.com.my.app.identifier") {
    userDefaults.setValue("value to save", forKey: "Key")
}
Run Code Online (Sandbox Code Playgroud)

读回它们你可以使用:

if let userDefaults = UserDefaults(suiteName: "group.com.my.app.identifier") {
    let value = userDefaults.string(forKey: "Key")
}
Run Code Online (Sandbox Code Playgroud)

由于 Widget 将用 SwiftUI 编写,因此您可以使用属性包装器@AppStorage来访问值:

@AppStorage("Key", store: UserDefaults(suiteName: "group.com.my.app.identifier"))
var value: String = ""
Run Code Online (Sandbox Code Playgroud)

如果您已经存储了要在其中使用的值,UserDefaults.standard则需要将它们复制到UserDefaults(suitName:).

  • 请记住,“@AppStorage”包装器不会更新视图。该值将被读取一次,但永远不会更新,因为小部件中的视图是*静态*并且仅由提供者刷新。 (3认同)