Доступ к настройкам пользователя iTunes в OSX Lion - PullRequest
1 голос
/ 20 сентября 2011

Я хочу получить доступ к пользовательским настройкам iTunes, таким как плейлисты, программно.

Я использую это для следующего кода, однако, начиная с OSX Lion, я получаю ноль в ответ.

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

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

Я также убедился, что в моем приложении включены все права.

Любые предложения о том, как я могу это исправить?

1 Ответ

3 голосов
/ 14 января 2012

Короче говоря: вы просто не можете сделать это, используя приложение в песочнице. Выключите Песочницу, и вы увидите, что она работает. Зачем? Ну, это из-за контейнеров. Песочница живет в своем собственном контейнере, поэтому при вызове [NSUserDefaults standardUserDefaults] Какао использует путь вашего контейнера, а не путь POSIX ~ / Library / Preferences, где находится com.apple.iApps.plist. Это подводит итог, почему вы получаете ноль. Кроме того, здесь в 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]; }

Когда все сказано и сделано, проложите полный путь к списку. Он не менялся годами, поэтому вы можете считать его липким.

Так что теперь вы можете получить что-то похожее на это:

2

    NSURL * prefURL = [[NSURL libraryPOSIXURL] URLByAppendingPathComponent:@"Preferences" isDirectory:YES];
    prefURL = [prefURL URLByAppendingPathComponent:@"com.apple.iApps.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

Нам нравится наше приложение с песочницей ?! В основном добавьте ваше временное право, и вы должны снова участвовать в гонках. Удачи тебе!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...