背景
我正在开发一个带有相关 Today Widget 扩展的 OSX 应用程序。我希望主应用程序和扩展程序可以共享用户首选项,这与与Apple 的包含应用程序共享数据中的描述非常相似。就我而言,主应用程序写入首选项,扩展程序读取它们。
应用程序和扩展程序都是沙盒化的。他们也是同一个应用程序组的成员。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 文件,其中扩展程序需要如上所述。