Objective c 在OSX Lion中访问iTunes用户首选项

Objective c 在OSX Lion中访问iTunes用户首选项,objective-c,itunes,osx-lion,playlist,Objective C,Itunes,Osx Lion,Playlist,我想以编程方式访问iTunes用户首选项,如播放列表 我使用下面的代码来实现它,但是自从OSX Lion之后,我得到了一个nil的响应 NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; NSDictionary *userPreferences = [userDefaults persistentDomainForName:@"com.apple.iApps"]; NSArray *databasePat

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

我使用下面的代码来实现它,但是自从OSX Lion之后,我得到了一个nil的响应

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

NSArray *databasePaths = [userPreferences objectForKey:@"iTunesRecentDatabasePaths"];
我还确保我的应用程序启用了所有权限


关于如何解决这个问题,有什么建议吗?

长话短说:你就是不能用沙盒应用程序来解决这个问题。关闭沙箱,您将看到它是有效的。为什么?那是因为集装箱。沙盒位于自己的容器中,因此当您调用[NSUserDefaults standardUserDefaults]时,Cocoa使用容器的路径,而不是com.apple.iApps.plist所在的~/Library/Preferences的POSIX路径。这就是为什么你得零分的原因。此外,NSUserDefaults中有一个关于此的简介:

如何解决这个问题

这真的不坏。首先,您需要做一些工作来获取主目录的POSIX路径。我设置了一系列NSURL分类方法。但是根路径是基于POSIX的。下面是让您开始学习的代码片段

一,

当一切都说了,做了,构建一个完整的路径到plist。多年来它没有改变,所以你可以认为它很粘。< / P> 所以你现在可能会得到这样的结果:

二,

现在让我们把这个plist,它相当小,变成我们可以玩的东西。也许是NSData?听起来不错,对吧

三,

好的,最后我们可以用这个来得到一本NSD字典。我是这样做的

四,

是的,是的,这是词典上的另一个类别。我一定有一百万个

因为我有一种分享的心情,你看:

+ (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


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

太棒了。感谢您的详细解释。将plist的内容放入dict的另一种更简单的方法是:NSDictionary*plistDict=[[NSDictionary alloc]initWithContentsOfURL:prefURL];嘿,那NSHomeDirectory()呢;或NSHomeDirectoryForUser(NSString*用户名);用于获取主目录?否…如果应用程序是沙盒,这些将返回容器中的文件夹。添加临时异常后,我仍然得到拒绝。该消息看起来像沙盒[5698]([5696]):(5696)拒绝文件读取数据/Users//Library/Preferences/com.apple.iPhoto.plist。临时异常是什么样子的?我在权限plist com.apple.security.temporary-exception.files.home-relative-path.read-write com.apple.security.temporary-exception.files.absolute-path.read-write中添加了类似的内容
    NSURL * prefURL = [[NSURL libraryPOSIXURL] URLByAppendingPathComponent:@"Preferences" isDirectory:YES];
    prefURL = [prefURL URLByAppendingPathComponent:@"com.apple.iApps.plist"];
 NSData * prefData = [NSData dataWithContentsOfURL:prefURL];
NSDictionary * prefDict = [NSDictionary collectionFromPropertyList:prefData];
+ (id) collectionFromPropertyList:(NSData *)pList {

    if ( [pList length] > 0 )
        return [NSPropertyListSerialization propertyListWithData:pList 
                                                         options:NSPropertyListImmutable 
                                                          format:nil error:nil];
    return nil;
}