OSX NSUserDefaults不起作用。

4

在我的应用程序中,这段代码总是给出NO这个答案。但是在我复制它到其他项目中时确实能够正常工作...... 所以我的standardUserDefaults可能出了问题,但我绝对不知道如何解决!

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setBool:YES forKey:@"myKey"];

BOOL test = [defaults boolForKey:@"myKey"];
// test is ALWAYS NO here!

请问有人能提示我该从哪里开始或如何解决这个问题吗?

这是一个混合使用 Swift 和 Objective-C 的项目,在我的 AppDelegate.swift 文件中加入以下内容后,出现了相同的行为问题:

```swift applicationDidFinishLaunching ```
let defaults = NSUserDefaults.standardUserDefaults()        
defaults.setBool(true, forKey: "myKey")

let test = defaults.boolForKey("myKey")
// test ALWAYS false here   

在有人提问之前: - 是的,即使在它之间调用了synchronize - 是的,这就是整个代码,行之间没有其他内容... 在设置和获取之后不起作用


你是如何检查 test 的值的? - Wain
我用NSLog和调试器断点直接检查了它。还使用了同步并在文件中检查...但是文件从未被创建!但我发现了一些东西:当我更改我的捆绑标识符时,它可以工作...但我不能改变这个!它已经在iTunes Connect中注册(它是一个沙盒化的App Store应用程序)-而且这个应用程序之前是可以工作的,我无法确定版本控制中何时开始出现这种行为...从来没有更改过捆绑标识符。 - Axel Zehden
我的应用程序本身从不使用NSUserDefaults,而是使用像dropbox.framework或Google API这样的其他库。我不知道为它们注册什么,我只知道它们失败了,因为NSUserDefaults没有存储任何信息。-并且更改bundle id只起作用一次。在删除容器和密钥链中的条目以重新开始并进行新安装测试后,它再次失败...我是否遗漏了要删除的内容(甚至从XCode中删除了derivedData)? - Axel Zehden
发现这个:https://ind.ie/labs/blog/app-sandbox-updating-nsuserdefaults-fails-after-deleting-apps-container-directory/ - 但即使清空垃圾桶,它也没有重新创建或再次工作。 - Axel Zehden
从OSX?我尝试了,没有任何变化。 - Axel Zehden
显示剩余2条评论
1个回答

8

我找到了一个解决方案,可以修复它,但不知道为什么会出现这种情况,也没有干净、好的方法。

如果有人能够解释这个问题并给出更好的解决方案,请告诉我!

  1. the problem was: If you delete the container of a sandboxed app, you also delete the plist for the NSUserDefaults and it's not created again and so NSUserDefaults simply is not working.

  2. the workaround: As I found here https://ind.ie/labs/blog/app-sandbox-updating-nsuserdefaults-fails-after-deleting-apps-container-directory/ it's a problem with the permanent bookmark of the system. Well just to empty the trash does not work for me, but what worked: I simply created the missing file!

    touch ~/Library/Containers/com.example.myapp/Data/Library/Preferences/com.example.myapp.plist
    

谢谢!这个节省了我可能数小时的时间。 - User

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接