1

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

我以前用下面的代码来做,但是自从 OSX Lion 之后,我得到一个 nil 作为响应。

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

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

我还确保我的应用程序启用了所有权利。

关于如何解决这个问题的任何建议?

4

1 回答 1

3

长话短说:你不能使用沙盒应用程序来做到这一点。关闭沙盒,您将看到它有效。为什么?嗯,那是因为容器。沙箱存在于自己的容器中,因此当您调用 [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

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

于 2012-01-14T06:31:00.640 回答