Проблема с написанием списка в локальном или административном режиме

#objective-c #cocoa #macos #plist #bundle

#objective-c #cocoa #macos #список #пакет

Вопрос:

В моем приложении я сохраняю пользовательские настройки (которые применимы для всех пользователей) в файле plist, который прикреплен в виде пакета.

Проблема в том, что в режиме администратора он работает нормально, но когда я запускаю приложение, оно не записывает файл. Нужно ли мне устанавливать какой-либо атрибут для записи в plist в локальном режиме? Или это вообще невозможно?

Мой код для записи файла приведен ниже:

 -(void)SavePrefrence:(NSString *)fileName PrefrenceOption:(NSMutableDictionary *)pDict{
    NSString *filePath  = [[[NSBundle mainBundle] pathForResource:fileName ofType:@"plist"] retain];

    NSDictionary *pTemp = [[NSDictionary alloc]initWithDictionary:pDict];
    bool bRet = [pTemp writeToFile:filePath atomically:YES]; 

    if(bRet==YES){
        NSLog(@"File Saved ");
    }
    else {
        NSLog(@"File not saved ");
    }


}
  

Это код, который его вызывает:

 -(void)SaveListSettings:(NSMutableDictionary *)pListSettings{
    [ self SavePrefrence:@“MyList" PrefrenceOption:pListSettings];
    if(pListInfo)
        [pListInfo release];
    [self LoadListProfile];

}
  

Ответ №1:

Пакет приложений по умолчанию будет доступен для записи только владельцу (если он установлен путем перетаскивания в папку Applications, это будет тот, кто его установил; если он установлен с помощью .pkg, вероятно, это должен быть root). Способ, которым вы это делаете, если я правильно ему следую, требует, чтобы у пользователя был доступ на запись к папке содержимого / ресурсов приложения, что является действительно плохой идеей (не то чтобы это было неслыханно — см. Документацию Университета Юты о «Плохо созданных приложениях» для примеров). На самом деле, сохранение настроек внутри приложения в любом случае является плохой идеей; для этого предназначены различные папки Library / Preferences (~/Library / Preferences для личных настроек, /Library / Preferences для общесистемных настроек. Но, конечно, /Library / Preferences доступен для записи только администраторам (по очень веским причинам). Я действительно не знаю хорошего способа справиться с этим, поскольку общесистемные настройки, изменяемые не-администраторами, не совсем нормальны.

Ответ №2:

Вы могли бы использовать программу установки, которая запрашивает пароль администратора, а затем создать «/ Library / Application Support / MyApp», а затем либо сделать этот мир доступным для записи, либо создать внутри него подпапку, доступную для записи во всем мире. Теперь MyApp, работающее под учетной записью, отличной от учетной записи администратора, все еще может выполнять запись в эту общую папку.

Если вы не хотите, чтобы папка была доступна для записи во всем мире, тогда включите в комплект вспомогательное приложение для записи и сделайте вспомогательный setuid root с помощью установщика, который запрашивает пароль администратора…

Кстати: оба этих варианта не соответствуют правилам Mac App Store. Возможно, вы можете использовать ‘/Users / Shared’, но я не знаю, разрешено ли это MAS, и в любом случае это далеко от стандарта. В результате вам придется хранить его на веб-сервере…