小编acw*_*acw的帖子

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

背景

我正在开发一个带有相关 Today Widget 扩展的 OSX 应用程序。我希望主应用程序和扩展程序可以共享用户首选项,这与与Apple 的包含应用程序共享数据中的描述非常相似。就我而言,主应用程序写入首选项,扩展程序读取它们。

  • 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
Run Code Online (Sandbox Code Playgroud)

代码

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

NSUserDefaults.init(suiteName: "com.example.Common")
Run Code Online (Sandbox Code Playgroud)

问题

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

~/Library/Containers/com.example/Data/Library/Preferences/com.example.Common.plist
Run Code Online (Sandbox Code Playgroud)

当扩展打开时,它的NSUserDefault实例是空的。

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

~/Library/Group Containers/com.example.Common/Library/Preferences/com.example.Common.plist
Run Code Online (Sandbox Code Playgroud)

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

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

macos xcode nsuserdefaults appstore-sandbox appgroups

6
推荐指数
1
解决办法
774
查看次数