Как поделиться файлом настроек между двумя изолированными приложениями?
В проекте у меня есть приложение и помощник, работающий в качестве агента. Основное приложение используется для установки пользовательских настроек и может некоторое время не использоваться. Вспомогательное приложение, которое запускается с помощью launchd при запуске, использует эти настройки для выполнения некоторых повседневных задач. Он читает и обновляет файл настроек. Помощник находится в/Applications/Main.app/Contents/Library/LoginItems
Msgstr "Когда эти приложения не находились в изолированной среде, было легко читать и писать файл общих настроек, расположенный в /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-группа
Предоставляет доступ к групповым контейнерам, которые совместно используются несколькими приложениями, созданными одной группой разработчиков, и обеспечивает определенную дополнительную межпроцессную связь между приложениями.
На той же странице, на которую ссылаются выше, находится раздел "Добавление приложения в группу приложений" для получения дополнительной информации.
Я думаю, что единственное решение состоит в том, чтобы обрабатывать предпочтения в основном с помощью словаря, расположенного в контейнере группы. К счастью, в контексте этого приложения основное приложение и помощник не могут изменять файл настроек одновременно.
Ключ на самом деле создать группу песочницы. Благодарю.