为什么应用程序组不能在我的 WatchKit 扩展中工作?
Why won't app groups work inside my WatchKit extension?
我看过 SO 的所有其他关于在主机应用程序和应用程序扩展之间共享 NSUserDefaults 数据的帖子,但我的仍然不起作用。这是我所做的一切:
- 在 Xcode 的 "Capabilities" 选项卡上为扩展程序和主机应用程序启用应用程序组。
- 将群组名称设置为 "group.com.mycompany.foo" 并确认扩展程序和主机应用已添加到群组中。
- 已确认两者都存在授权文件,"com.apple.security.application-groups" 密钥设置为我的应用程序组名称。 (就其价值而言,我还在扩展程序和主机应用程序之间使用了共享钥匙串功能,并且正在运行——所以我认为这不是权利问题)
- 重新生成了所有配置文件。事实上,我什至在设置应用组后撤销了我所有的证书并重新生成了所有配置文件。
所有这些之后,此代码仍然不起作用:
// 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 首选项时,我注意到这些图标,none 其中有 "App Group" 图标:
但正如我之前所说,在设置应用程序组后,我甚至清除了我的钥匙串、证书和配置文件。因此,如果这确实是问题所在,我该如何将权利添加到配置文件中?
我错过了什么?我没有想法。
帮忙?
编辑:访问组在我的 Today & Safari 扩展中有效,只是不在 WatchKit 扩展中。我不知道为什么,所有构建设置似乎都以相同的方式配置。
编辑 2:对于那些坚持认为我的功能设置不正确的人,这里是屏幕截图:
您是否尝试从 iPhone 应用读取相同的密钥?
我认为问题在于您没有在 WatchKit 扩展中激活 App Group 权利。
Select 您的项目设置下的 WatchKit 扩展。
Select WatchKit Extension 下的 Capabilities 选项卡并查找 App Groups 并将其打开 on.
Select 与您之前创建的应用程序组标识符相同(它应该会自动出现并检查它)。
我遇到了类似的问题。我注意到,我的 WatchKit Extension 和 WatchKit App 具有相同的包标识符。我更改了 WatchKit 应用程序的包 ID。此外,我没有忘记更改扩展 info.plist 中的 NSExtensionAttributes/WKAppBundleIdentifier 以匹配该 ID。现在一切正常。希望对您有所帮助!
很快:WatchKit App 和 Extension 的包标识符应该不同!
这就是我的诀窍。显然 Xcode 自动为新扩展创建了一个新的权利文件(可能是在我从 "Capabilities" 设置它之后但不幸的是数组的值丢失了...
在应用程序权利中:
在扩展权利中,数组中缺少值:
同样重要的是要确保该组出现在两个目标(应用程序和扩展程序)的 "Capability" 选项卡中并且所有 3 个复选标记都是绿色的,请参见示例:
应用目标
扩展目标
我看过 SO 的所有其他关于在主机应用程序和应用程序扩展之间共享 NSUserDefaults 数据的帖子,但我的仍然不起作用。这是我所做的一切:
- 在 Xcode 的 "Capabilities" 选项卡上为扩展程序和主机应用程序启用应用程序组。
- 将群组名称设置为 "group.com.mycompany.foo" 并确认扩展程序和主机应用已添加到群组中。
- 已确认两者都存在授权文件,"com.apple.security.application-groups" 密钥设置为我的应用程序组名称。 (就其价值而言,我还在扩展程序和主机应用程序之间使用了共享钥匙串功能,并且正在运行——所以我认为这不是权利问题)
- 重新生成了所有配置文件。事实上,我什至在设置应用组后撤销了我所有的证书并重新生成了所有配置文件。
所有这些之后,此代码仍然不起作用:
// 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 首选项时,我注意到这些图标,none 其中有 "App Group" 图标:
但正如我之前所说,在设置应用程序组后,我甚至清除了我的钥匙串、证书和配置文件。因此,如果这确实是问题所在,我该如何将权利添加到配置文件中?
我错过了什么?我没有想法。
帮忙?
编辑:访问组在我的 Today & Safari 扩展中有效,只是不在 WatchKit 扩展中。我不知道为什么,所有构建设置似乎都以相同的方式配置。
编辑 2:对于那些坚持认为我的功能设置不正确的人,这里是屏幕截图:
您是否尝试从 iPhone 应用读取相同的密钥?
我认为问题在于您没有在 WatchKit 扩展中激活 App Group 权利。
Select 您的项目设置下的 WatchKit 扩展。
Select WatchKit Extension 下的 Capabilities 选项卡并查找 App Groups 并将其打开 on.
Select 与您之前创建的应用程序组标识符相同(它应该会自动出现并检查它)。
我遇到了类似的问题。我注意到,我的 WatchKit Extension 和 WatchKit App 具有相同的包标识符。我更改了 WatchKit 应用程序的包 ID。此外,我没有忘记更改扩展 info.plist 中的 NSExtensionAttributes/WKAppBundleIdentifier 以匹配该 ID。现在一切正常。希望对您有所帮助!
很快:WatchKit App 和 Extension 的包标识符应该不同!
这就是我的诀窍。显然 Xcode 自动为新扩展创建了一个新的权利文件(可能是在我从 "Capabilities" 设置它之后但不幸的是数组的值丢失了...
在应用程序权利中:
在扩展权利中,数组中缺少值:
同样重要的是要确保该组出现在两个目标(应用程序和扩展程序)的 "Capability" 选项卡中并且所有 3 个复选标记都是绿色的,请参见示例:
应用目标
扩展目标