【问题标题】:Why won't app groups work inside my WatchKit extension?为什么应用程序组不能在我的 WatchKit 扩展中工作?
【发布时间】:2023-03-15 00:07:01
【问题描述】:

我已经看过 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”图标:

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

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

帮助?

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

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

【问题讨论】:

  • 您是否尝试过单击 Xcode 配置文件列表左下角的“刷新”按钮?
  • 大概一百万次。 :(
  • 在您附加的视图中,权利列中没有应用程序组图标(至少我没有它并且应用程序组对我有用)。回到问题:您是否 100% 确定主机应用程序和扩展目标都使用正确的配置文件和代码签名身份进行签名?正确的意思是com.mycompany.foo.myappcom.mycompany.foo.myapp.myappwatchkitextension。通配符在这里不起作用。
  • FWIW,我的个人资料都没有包含应用程序组图标,即使那些确实与应用程序组一起工作的个人资料也是如此。我不会注意该图标是否显示在该列表中。如果应用目标设置的“功能”部分显示应用组已启用,那么应该就足够了。
  • 好的,我将忽略这些图标。功能肯定是启用的。并且配置文件是明确设置的,没有通配符(com.myapp 和 com.myextension)。我正在拔头发,一开始我的头发已经不多了。

标签: ios nsuserdefaults ios-app-extension watchkit ios-app-group


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 它已启用,并且权利文件看起来与我已经工作的扩展的权利文件相同。我的构建设置正确引用了此权利文件(我知道这一点,因为尽管应用程序组不工作,但共享钥匙串仍在工作)。
  • 在 iPhone 应用中设置后是否尝试读取相同的密钥?
  • 查看原始问题中的代码。我正在从同一个键设置和读取。
  • 这是我花了几个小时在网上搜索的正确答案。我已经将我们必须选择应用程序扩展然后打开功能的部分加粗。谢谢老兄!
  • 这不是正确的答案。这是我的设置的屏幕截图。它清楚地表明这是正确配置的,但它仍然没有。它适用于其他扩展,但不适用于 watchkit 扩展:i.imgur.com/JR9lwaO.jpg
【解决方案2】:

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

简而言之:WatchKit App 和 Extension 的捆绑包标识符应该不同!

【讨论】:

  • 这就是问题所在!非常感谢!
  • 这不适用于 WachOS 2+。在这种情况下,您应该使用WatchConectivity
【解决方案3】:

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

在应用程序中的权利:

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

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

应用目标

扩展目标

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多