UserDefaults 在同一个应用程序组中具有不同的值

Posted

技术标签:

【中文标题】UserDefaults 在同一个应用程序组中具有不同的值【英文标题】:UserDefaults have different values within same app group 【发布时间】:2018-10-22 22:55:55 【问题描述】:

我有 App+Extension,我做了这样的共享存储

extension UserDefaults 
    static let suiteName = "group.myApp"
    static let extensions = UserDefaults(suiteName: suiteName)!

    private enum Keys 
        static let personNames = "personNames"
    

    var personNames: [String] 
        get 
            guard let array = UserDefaults.extensions.array(forKey: Keys.personNames) as? [String] else 
                return []
            
            return array
        
        set 
            UserDefaults.extensions.setValue(newValue, forKeyPath: Keys.personNames)
        
    

但是当我调试应用程序时,我看到内存地址 A 和正确的值(因为我通过主应用程序放置值但是当我调试扩展时我有内存地址 B 并且没有里面的值。

我在主应用和扩展应用上使用相同的 AppGroup,并且我访问这样的数据

   let personNames = UserDefaults.extensions.personNames

我使用免费的 Apple ID 帐户有问题吗?我有可能用这个帐户创建组,所以我怀疑。

【问题讨论】:

不要使用setValue 方法你应该使用set(yourObject, forKey: "yourKey") 【参考方案1】:

编辑: 是的,您可能需要一个付费的 Apple 开发者帐户,因为您必须启用与您的应用 ID 相关联的应用组功能。

原答案: 您可能需要致电synchronize() 将数据立即写入磁盘。

var personNames: [String] 
    get 
        guard let array = UserDefaults.extensions.array(forKey: Keys.personNames) as? [String] else 
            return []
        
        return array
    
    set 
        UserDefaults.extensions.setValue(newValue, forKeyPath: Keys.personNames)
        UserDefaults.extensions.synchronize()
    

【讨论】:

感谢您的评论,但很遗憾没有帮助。 您好,但是我启用了应用程序组,您可以看到它应该足够了developer.apple.com/support/app-capabilities 能否在“功能”下添加“应用组”部分的屏幕截图?【参考方案2】:

好的,我找到了解决方案。我使用 goup.com.company.appName.sharedStorage 格式创建了新组,并且我将其用作 suitName 并且一切正常。

所以可能是因为免费的苹果帐户在创建应用组时出现问题(因为它是自动的)或者可能是因为 group.appName 格式无效。

【讨论】:

以上是关于UserDefaults 在同一个应用程序组中具有不同的值的主要内容,如果未能解决你的问题,请参考以下文章

在 SwiftUI 中使用 UserDefaults 进行全局更新

如何使用在托管资源组中具有权限的身份部署托管应用程序?

如何在 UserDefaults 中存储自定义对象?

在单元测试中模拟 UserDefaults 对象返回 _ArrayBuffer

从每组中的 3 个表中选择 sql 中具有最新日期的行

在组中的第一个 btn 上引导 CSS 边框半径