在沙箱中从辅助应用程序读取NSUserDefaults

4
我找到了一些关于读取另一个应用程序的NSUserDefaults的资源。 Objective-C NSUserDefaults缓存阻止另一个应用程序准确地读取更改 NSUserDefaults:是否可以从另一个应用程序获取userDefaults? 显然,这是不可能的。 但是问题首先涉及iOS,其次两个应用程序完全不同。
我有一个LaunchAtLogin助手应用程序。 但它还执行其他任务。 因此,助手应用程序应始终运行,但仅在NSUserDefaults中设置BOOL时才启动主应用程序。
我该如何实现这一点?
3个回答

4
可以使用安全应用组和-[NSUserDefaults initWithSuiteName:]来在主应用程序和辅助应用程序之间共享偏好设置:
安全应用组
为了让多个应用程序共享一个公共容器,您需要将com.apple.security.application-groups授权(在您的主应用程序和辅助应用程序中)设置为一个公共标识符,例如@"com.company.my-app-suite"。有关更多信息,请参见将应用程序添加到组中
用户默认套件
根据OS X 10.9基础知识释放说明
对于属于安全应用程序组的应用程序,NSUserDefaults“套件”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]


在类参考文档中我没有看到 [NSUserDefaults initWithSuiteName:] 这个方法? - trojanfoe
2
请注意:这两个应用程序都需要进行沙盒处理... 如果您的应用程序没有进行沙盒处理,则无法添加此功能。 - Peter Lapisu
@PeterLapisu,在非沙盒应用程序中实现的方式是什么? - Vladimir Prudnikov
没有沙盒是无法使用它的...你可以尝试实现一些共享文件或分布式对象。 - Peter Lapisu

4

自10.7.4版本开始,您可以在沙盒内使用应用程序组。 组内的所有应用程序共享同一个沙盒。 请参阅Application Groups了解如何设置它们。


这是否意味着NSUserDefaults将自动共享?苹果的文档并没有提供太多信息。 - IluTov
偏好设置是沙盒的一部分。 - diederikh
但是它没有起作用。我也尝试过使用 addSuiteNamed:@"com.MyApp.TheGUIPartOfMyApp"... - IluTov
它确实起作用了,抱歉这实际上是我的错。 我在辅助应用程序的开头进行了观察者的初始化,因此如果我在主应用程序中切换标志,它不会更新。 - IluTov

1

应用程序可以在iCloud上共享容器目录。

从苹果的文档中配置您的iCloud权限:

iCloud容器字段标识了您的应用程序可以访问用户iCloud存储中的容器目录列表。 (此字段对应于com.apple.developer.ubiquity-container-identifiers权限)。 您添加到此列表中的字符串必须对应于您的团队创建的应用程序的捆绑标识符。 Xcode使用当前应用程序的捆绑标识符来指定第一个字符串; 如果您想要多个应用程序共享主容器目录,则可以将其更改为不同的捆绑标识符。 您还可以为您团队的其他应用程序添加其他捆绑标识符。


我不确定这怎么能帮到我。这只是设置一个键的值... 我想知道如何在两个应用程序之间共享NSUserDefaults - IluTov
没问题。圣诞快乐 ;) - IluTov
似乎除非设备越狱,否则这是不可能的。 - user1832451
不是iOS,而是OSX。它应该使用应用程序组工作,我正在研究中。无论如何,谢谢。 - IluTov
好的,但我不想使用iCloud,因为有一个共享属性问题... 看看 Diederik Hoogenboom 的回答。也许你知道哪里出了问题。 - IluTov
这是我的另一个问题:https://dev59.com/nGzXa4cB1Zd3GeqPTnFU 同样的解决方案,在那里你可以看到为什么它对我不起作用。 - IluTov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接