我想以编程方式访问iTunes用户首选项,例如播放列表。
我使用以下代码来执行此操作,但是自OSX Lion以来,我的回复为零。
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
NSDictionary *userPreferences = [userDefaults persistentDomainForName:@"com.apple.iApps"];
NSArray *databasePaths = [userPreferences objectForKey:@"iTunesRecentDatabasePaths"];
我还确保我的应用已启用所有权利。
有关如何解决此问题的任何建议?
答案 0 :(得分:3)
长篇故事简短:你不能使用沙盒应用程序来做到这一点。关闭沙盒,你会发现它有效。为什么?嗯,这是因为容器。沙箱存在于自己的容器中,因此当您调用[NSUserDefaults standardUserDefaults]时,Cocoa使用容器的路径而不是com.apple.iApps.plist所在的〜/ Library / Preferences的POSIX路径。这总结了为什么你得到零。此外,NSUserDefaults中还有一个模糊点:link
如何解决这个问题?
真的不差。首先,您需要做一些工作才能获得主目录的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
我们喜欢我们的沙盒应用吗?!基本上添加你的临时权利,你应该再次参加比赛。祝你好运!