【问题标题】:Access iTunes user preferences in OSX Lion在 OSX Lion 中访问 iTunes 用户首选项
【发布时间】:2011-09-20 05:04:39
【问题描述】:

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

我曾经使用以下代码执行此操作,但是自从 OSX Lion 以来,我得到一个 nil 作为响应。

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

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

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

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

【问题讨论】:

    标签: objective-c itunes osx-lion playlist


    【解决方案1】:

    长话短说:您无法使用沙盒应用程序做到这一点。关闭沙盒,您将看到它有效。为什么?嗯,那是因为容器。沙箱存在于自己的容器中,因此当您调用 [NSUserDefaults standardUserDefaults] 时,Cocoa 使用容器的路径,而不是 com.apple.iApps.plist 所在的 ~/Library/Preferences 的 POSIX 路径。这总结了为什么你得到零。此外,在 NSUserDefaults 中有一个关于此的简介:link

    如何解决这个问题?

    真的不差。首先,您必须做一些工作来获取主目录的 POSIX 路径。我设置了一堆 NSURL 类别方法。但是根路径是基于 POSIX 的。这是帮助您入门的代码 sn-p。

    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

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

    【讨论】:

    • 太棒了。谢谢你的详细解释。
    • 另一种将 plist 的内容放入 dict 的更简单方法如下: NSDictionary* plistDict = [[NSDictionary alloc] initWithContentsOfURL:prefURL];
    • 嘿,NSHomeDirectory();或 NSHomeDirectoryForUser(NSString *userName);获取主目录?
    • 不...如果应用程序被沙盒化,这些将在您的容器中返回一个文件夹。
    • 添加临时异常后我仍然被拒绝。该消息看起来像这样 sandboxd[5698] ([5696]): (5696) deny file-read-data /Users//Library/Preferences/com.apple.iPhoto.plist。临时异常看起来如何?我在权利 plist com.apple.security.temporary-exception.files.home-relative-path.read-writecom.apple.security 中添加了类似的内容。临时异常.files.absolute-path.read-write
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-09
    • 1970-01-01
    • 1970-01-01
    • 2017-11-07
    • 2012-06-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多