访问OSX Lion中的iTunes用户首选项

时间:2011-09-20 05:04:40

标签: objective-c itunes osx-lion playlist

我想以编程方式访问iTunes用户首选项,例如播放列表。

我使用以下代码来执行此操作,但是自OSX Lion以来,我的回复为零。

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
NSDictionary *userPreferences = [userDefaults persistentDomainForName:@"com.apple.iApps"];

NSArray *databasePaths = [userPreferences objectForKey:@"iTunesRecentDatabasePaths"];

我还确保我的应用已启用所有权利。

有关如何解决此问题的任何建议?

1 个答案:

答案 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

我们喜欢我们的沙盒应用吗?!基本上添加你的临时权利,你应该再次参加比赛。祝你好运!