长话短说:你不能使用沙盒应用程序来做到这一点。关闭沙盒,您将看到它有效。为什么?嗯,那是因为容器。沙箱存在于自己的容器中,因此当您调用 [NSUserDefaults standardUserDefaults] 时,Cocoa 使用容器的路径,而不是 com.apple.iApps.plist 所在的 ~/Library/Preferences 的 POSIX 路径。这总结了为什么你得到零。此外,在 NSUserDefaults 中有一个关于此的简介:链接
如何解决这个问题?
真的还不错。首先,您必须做一些工作来获取主目录的 POSIX 路径。我设置了一堆 NSURL 类别方法。但是根路径是基于 POSIX 的。这是帮助您入门的代码片段。
1.
+ (NSURL *) homePOSIXURL {
struct passwd *pwUser = getpwuid(getuid());
const char *homeDir = pwUser->pw_dir;
return [NSURL fileURLWithPath:[NSString stringWithUTF8String:homeDir] isDirectory:YES]; }
当一切都说完了,构建一个完整的plist路径。它多年来没有改变,所以你可以认为它很粘。
所以你现在可能会得到如下所示的东西:
2.
NSURL * prefURL = [[NSURL libraryPOSIXURL] URLByAppendingPathComponent:@"Preferences" isDirectory:YES];
prefURL = [prefURL URLByAppendingPathComponent:@"com.apple.iApps.plist"];
现在让我们把这个相当小的 plist 变成我们可以玩的东西。也许是 NSData?听起来不错,对吧?
3.
NSData * prefData = [NSData dataWithContentsOfURL:prefURL];
好的,最后我们现在可以使用它来获取 NSDictionary。这是我的做法。
4.
NSDictionary * prefDict = [NSDictionary collectionFromPropertyList:prefData];
是的,是的,NSDictionary 上的另一个类别。我必须有一百万个。
因为我有分享的心情,所以你去:
+ (id) collectionFromPropertyList:(NSData *)pList {
if ( [pList length] > 0 )
return [NSPropertyListSerialization propertyListWithData:pList
options:NSPropertyListImmutable
format:nil error:nil];
return nil;
}
所以,你认为我们已经完成了吗?嗯,差不多。如果你走到这一步,你会得到这样的拒绝:
拒绝文件读取数据 /Users/UserName/Library/Preferences/com.apple.iApps.plist
我们喜欢我们的沙盒应用吗?!基本上添加您的临时权利,您应该再次参加比赛。祝你好运!