如何在两个沙盒应用程序之间共享首选项文件?

Lio*_*l_A 0 c cocoa objective-c appstore-sandbox

在一个项目中,我有一个应用程序和一个作为代理运行的帮助程序.主应用程序用于设置用户首选项,可能暂时不使用.launchd在启动时启动的帮助应用程序使用这些首选项来执行一些日常任务.它读取并更新首选项文件.助手位于" /Applications/Main.app/Contents/Library/LoginItems".当这些应用程序没有沙箱时,很容易读取和写入位于的共享首选项文件/Users/username/Library/Preferences/.

我试图在帮助应用程序中添加权利键com.apple.security.temporary-exception.shared-preference.read-write,其中包含一个包含主应用程序首选项文件路径的数组:"/ Library/Containers/com.mycompany.MainApp/Data/Library/Preferences/".但它根本行不通.对于帮助应用程序,首选项文件不存在.

Mic*_*all 5

您需要利用两件事来支持主应用程序和帮助应用程序之间的共享容器和首选项:

安全应用程序组

为了让多个应用程序共享一个公共容器,您需要将com.apple.security.application-groups权利(在主应用程序和帮助应用程序中)设置为公共标识符,例如@"com.company.my-app-suite".有关详细信息,请参阅向组中添加应用程序.

用户默认套件

根据OS X 10.9基础发行说明:

对于属于安全应用程序组的应用程序,NSUserDefaults"套件"API(-initWithSuiteName:, - addSuiteNamed:和-removeSuiteNamed :)将在组中的应用程序共享的套件上运行,并存储在组容器中,如果suite identifier是组的标识符.

因此,您需要在应用程序委托(或类似)中执行类似的操作:

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

并使用它代替[NSUserDefaults standardUserDefaults]整个应用程序.