在沙盒 OSX 应用程序和扩展程序之间共享 NSUserDefault

Posted

技术标签:

【中文标题】在沙盒 OSX 应用程序和扩展程序之间共享 NSUserDefault【英文标题】:Shared NSUserDefault between sandboxed OSX app and extension 【发布时间】:2016-09-03 19:52:11 【问题描述】:

背景

我正在开发一个带有关联 Today Widget 扩展的 OSX 应用程序。我想要主应用程序和共享用户偏好的扩展程序,就像 Apple 的 Sharing Data with Your Containing App 中描述的一样。在我的例子中,主应用程序编写首选项,而扩展程序读取它们。

OSX 10.11.6 Xcode 7.3.1 斯威夫特 2.2

应用和扩展程序都是沙盒的。它们也是同一个应用程序组的成员。相关权利,使用验证 codesign -d --entitlements,在应用程序和扩展程序上:

com.apple.security.app-sandbox: true
com.apple.security.application-groups:
  - com.example.Common

代码

应用和扩展共享相同的代码来初始化和访问NSUserDefaults

NSUserDefaults.init(suiteName: "com.example.Common")

问题

主应用程序在以下位置创建首选项:

~/Library/Containers/com.example/Data/Library/Preferences/com.example.Common.plist

然后打开扩展时,其NSUserDefault 实例为空。

如果我将应用创建的 plist 移动到:

~/Library/Group Containers/com.example.Common/Library/Preferences/com.example.Common.plist

扩展的 NSUserDefault 实例填充了预期值。

注意: 从 Xcode 构建和运行应用程序时不会发生以下情况,仅在选择产品 -> 存档,然后选择导出 -> 导出为 Mac 应用程序时。从 Xcode 构建/运行时,主应用程序会在扩展程序期望的位置创建 plist 文件,如上所述。

【问题讨论】:

【参考方案1】:

我现在也在做同样的事情——沙盒应用 + 共享扩展 + NSUserDefault + 应用程序组,它工作正常。也许 Apple 在此期间修复了一些错误?

【讨论】:

以上是关于在沙盒 OSX 应用程序和扩展程序之间共享 NSUserDefault的主要内容,如果未能解决你的问题,请参考以下文章

在沙盒 Appdomain 中加载程序集 - SecurityException

OS X 沙盒问题

在沙盒应用程序中使用 NSSavePanel 替换文件

如何在沙盒应用程序中获取用户主目录?

推送通知在沙盒模式下不起作用

在沙盒应用中访问桌面