Как поделиться файлом настроек между двумя изолированными приложениями?

В проекте у меня есть приложение и помощник, работающий в качестве агента. Основное приложение используется для установки пользовательских настроек и может некоторое время не использоваться. Вспомогательное приложение, которое запускается с помощью launchd при запуске, использует эти настройки для выполнения некоторых повседневных задач. Он читает и обновляет файл настроек. Помощник находится в/Applications/Main.app/Contents/Library/LoginItemsMsgstr "Когда эти приложения не находились в изолированной среде, было легко читать и писать файл общих настроек, расположенный в /Users/username/Library/Preferences/,

Я пытался добавить в приложение помощника ключ доступа com.apple.security.temporary-exception.shared-preference.read-write с массивом, содержащим путь к главному файлу настроек приложения: "/Library/Containers/com.mycompany.MainApp/Data/Library/Preferences/Msgstr ". Но это просто не работает. Для вспомогательного приложения файл настроек не существует.

3 ответа

Решение

Вам нужно будет использовать две вещи для поддержки общего контейнера и предпочтений между основным и вспомогательным приложением:

Группы приложений безопасности

Чтобы несколько приложений могли использовать общий контейнер, вам нужно установить com.apple.security.application-groups право (в вашем основном и вспомогательном приложении) на общий идентификатор, такой как @"com.company.my-app-suite", См. Добавление приложения в группу для получения дополнительной информации.

User Defaults Suites

В соответствии с примечаниями к выпуску Foundation для OS X 10.9:

Для приложений, входящих в группу приложений безопасности, API-интерфейсы "suite" NSUserDefaults (-initWithSuiteName:, -addSuiteNamed: и -removeSuiteNamed:) будут работать с набором, общим для приложений в группе и сохраненным в контейнере группы, если Идентификатор комплекта - это идентификатор группы.

Таким образом, вы захотите сделать что-то вроде этого в вашем делегате приложения (или подобном):

- (NSUserDefaults *)sharedUserDefaults {
    static NSUserDefaults *shared = nil;
    if (!shared) {
        shared = [[NSUserDefaults alloc] initWithSuiteName:@"com.company.my-app-suite"];
    }
    return shared;
}

И использовать это вместо [NSUserDefaults standardUserDefaults] во всех ваших приложениях.

Вам нужно использовать группы песочницы:

com.apple.security.application-группа

Предоставляет доступ к групповым контейнерам, которые совместно используются несколькими приложениями, созданными одной группой разработчиков, и обеспечивает определенную дополнительную межпроцессную связь между приложениями.

На той же странице, на которую ссылаются выше, находится раздел "Добавление приложения в группу приложений" для получения дополнительной информации.

Я думаю, что единственное решение состоит в том, чтобы обрабатывать предпочтения в основном с помощью словаря, расположенного в контейнере группы. К счастью, в контексте этого приложения основное приложение и помощник не могут изменять файл настроек одновременно.

Ключ на самом деле создать группу песочницы. Благодарю.

Другие вопросы по тегам