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

时间:2013-11-17 11:25:04

标签: objective-c c cocoa appstore-sandbox

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

我试图在帮助应用程序中添加权利密钥com.apple.security.temporary - exception.shared-preference.read-write,其中包含一个包含主应用程序首选项文件路径的数组:“/ {{1} }”。但它根本行不通。对于帮助应用程序,首选项文件不存在。

3 个答案:

答案 0 :(得分:5)

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

安全应用程序组

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

用户默认套件

根据Foundation Release Notes for OS X 10.9

  

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

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

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

并在整个应用中使用{而不是[NSUserDefaults standardUserDefaults]

答案 1 :(得分:1)

您需要使用Sandbox Groups

  

com.apple.security.application基团

     

允许访问由单个开发团队生成的多个应用程序共享的组容器,并允许应用程序之间的某些其他进程间通信

在上面引用的同一页面上有一个标题为“将应用程序添加到应用程序组”的部分以获取更多信息。

答案 2 :(得分:0)

我认为唯一的解决方案是基本上使用位于组容器中的字典来处理首选项。幸运的是,在此应用程序的上下文中,主应用程序和帮助程序无法同时修改首选项文件。

关键是要创建一个沙盒组。感谢。