18

我已经看过 SO 的所有其他关于在主机应用程序和应用程序扩展之间共享 NSUserDefaults 数据的帖子,但我的仍然不起作用。这是我所做的一切:

  1. 在 Xcode 的“功能”选项卡上为扩展和主机应用程序启用应用程序组。
  2. 将组名设置为“group.com.mycompany.foo”并确认扩展和主机应用程序已添加到组中。
  3. 确认两者都存在一个权利文件,其中“com.apple.security.application-groups”键设置为我的应用程序组名称。(对于它的价值,我还在扩展程序和主机应用程序之间使用共享的钥匙串功能,这是有效的——所以我不认为这是权利的问题)
  4. 重新生成所有配置文件。事实上,我什至在设置应用程序组后撤销了所有证书并重新生成了所有配置文件。

毕竟,这段代码仍然不起作用:

// in the host app
NSUserDefaults *testDefaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.com.mycompany.foo"];
[testDefaults setObject:@"TEST" forKey:@"foo"];
[testDefaults synchronize];

进而:

// in the extension
NSUserDefaults *testDefaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.com.mycompany.foo"];
NSLog(@"%@", [testDefaults objectForKey:@"foo"]);

这导致:

(null)

当我查看 Xcode 首选项时,我注意到这些图标,它们都没有“App Group”图标: Xcode 首选项 - 权利

但正如我之前所说,我什至在设置应用程序组后清除了我的钥匙串、证书和配置文件。因此,如果这确实是问题所在,我该如何将权利添加到配置文件中?

我错过了什么?我的想法很新鲜。

帮助?

编辑:访问组在我的 Today & Safari 扩展中工作,而不是在 WatchKit 扩展中。我不知道为什么,所有构建设置似乎都是以相同的方式配置的。

编辑2:对于那些坚持我的能力设置不正确的人,这里是一个截图:能力

4

3 回答 3

6

我有类似的问题。我注意到,我的 WatchKit Extension 和 WatchKit App 具有相同的包标识符。我更改了 WatchKit 应用程序的捆绑包 ID。我也没有忘记在 Extension 的 info.plist 中更改 NSExtensionAttributes/WKAppBundleIdentifier 以匹配该 ID。现在一切正常。我希望这能帮到您!

很快:WatchKit App 和 Extension 的 Bundle 标识符应该不同!

于 2015-03-13T13:40:51.843 回答
2

这就是我的诀窍。显然 Xcode 自动为新扩展创建了一个新的权利文件(可能是在我从“功能”设置它之后,但不幸的是数组的值丢失了......

在应用程序中的权利:

在此处输入图像描述

在扩展权利中,数组中缺少该值:

在此处输入图像描述

此外,确保该组出现在两个目标(应用程序和扩展程序)的“功能”选项卡中并且所有 3 个复选标记均为绿色也很重要,请参见示例:

应用目标

在此处输入图像描述

扩展目标

在此处输入图像描述

于 2015-09-09T12:18:32.150 回答
1

您是否尝试从 iPhone 应用程序中读取相同的密钥?

我认为问题在于您没有在 WatchKit 扩展中激活 App Group 权利。

  1. 在您的项目设置下选择您的 WatchKit 扩展。

  2. 选择 WatchKit Extension 下的 Capabilities 选项卡并查找 App Groups 并将其打开

  3. 选择您之前创建的相同的应用程序组标识符(它应该会自动出现并检查它)。

于 2015-03-11T17:19:15.873 回答