【问题标题】:Reading NSUserDefaults from helper app in the sandbox从沙箱中的帮助应用程序读取 NSUserDefaults
【发布时间】:2012-12-23 20:20:26
【问题描述】:

我在阅读另一个应用程序的NSUserDefaults 时找到了一些资源。

Objective-C NSUserDefaults caching prevents another app from accurately reading changes

NSUserDefaults: Is it possible to get userDefaults from another app?

显然,这是不可能的。 然而问题首先与iOS有关,其次这两个应用程序完全不同。

我有一个 LaunchAtLogin 辅助应用。但它也执行其他一些任务。 因此,助手应用程序应该始终运行,但只有在设置了NSUserDefaults 中的BOOL 时才启动主应用程序。

有什么方法可以实现吗?

【问题讨论】:

    标签: objective-c macos cocoa nsuserdefaults sandbox


    【解决方案1】:

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

    【讨论】:

    • 这是否意味着NSUserDefaults 将被自动共享? Apple 的文档没有提供太多信息。
    • 首选项是沙箱的一部分。
    • 它没有工作。我也试过addSuiteNamed:@"com.MyApp.TheGUIPartOfMyApp"...
    • 它确实有效,抱歉这实际上是我的错。我在辅助应用程序开始时初始化了观察者,所以如果我在主应用程序中切换标志,它不会更新。
    【解决方案2】:

    可以使用安全应用程序组和-[NSUserDefaults initWithSuiteName:]在主应用程序和辅助应用程序之间共享首选项:

    安全应用程序组

    为了让多个应用共享一个公共容器,您需要将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“套件”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:]
    • 注意:两个应用程序都需要沙盒化...如果您的应用程序没有沙盒化,则无法添加此功能
    • @PeterLapisu 在非沙盒应用程序中的方法是什么?
    • 没有沙箱就没有办法使用它......你可以尝试实现某种共享文件或分布式对象
    【解决方案3】:

    应用可以在 iCloud 上共享一个容器目录。

    来自 Apple 关于配置 iCloud 权利的文档:

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

    【讨论】:

    • 我不确定这对我有什么帮助。这只会设置一个键的值...我想知道如何在两个应用程序之间共享NSUserDefaults
    • 没有问题。圣诞快乐;)
    • 除非设备越狱,否则似乎不可能
    • 这不是 iOS,而是 OSX。它应该使用我正在研究的 Application Groups 工作。还是谢谢。
    • 好的,但我不想使用 iCloud,因为它有一个共享属性……看看 Diederik Hoogenboom 的答案。也许你知道那里出了什么问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-05
    • 2013-06-20
    • 1970-01-01
    • 2016-03-31
    • 2011-02-14
    • 1970-01-01
    相关资源
    最近更新 更多