繁体   English   中英

iOS/OSX 应用程序组 ID,以“group”开头。 还是“team-id”?

[英]iOS/OSX App Group Ids, start them with “group.” or “team-id.”?

在 Provisioning Portal(或现在称为任何名称)中创建 App Group id 时,它说“为您的 App Group 输入一个唯一标识符,以字符串 'group' 开头”,并且似乎在输入字段中强制执行。 此外,许多示例代码使用应用组 ID 字符串,如“group.com.company.blah”。

但是,我在整个文档中看到链接的最终部分, App Sandbox Design Guide > App Sandbox In Depth > Container Directory and File System Access > The Application Group Container Directory and Entitlements Key Rerefence > Enabling App Sandbox > Add an App to一个 App Group ,直接反驳这一点,明确说明“必须以您的开发团队 ID 开头,后跟一个句点”。

这些部分中给出的示例分别类似于“Z123456789.com.example.app-group”和“DG29478A379Q6483R9214.HolstFirstAppSuite”。 (哇,最后一个是超级奇怪的团队ID还是什么?)

因此,由于这种不一致,我该怎么做才能使应用程序组 ID 起作用? 我应该在供应门户中输入“group.TEAM-ID.com.example.blah”吗? 我应该在我的源代码字符串中使用这个相同的字符串,还是省略“组”。 部分要像许多代码示例吗? 还是文档有误,从不需要团队 ID?

上下文...我一直在尝试更新 iOS cocoapod 的测试应用程序,以便我可以看到扩展 <-> 应用程序通信在运行。 将应用程序 id 和组 id 更新为我控制的一个后,当使用类似于项目原始组的组 id 时,例如“group.com.mycompany.thingie”,我看到containerURLForSecurityApplicationGroupIdentifier: do nothing but return nil 和其他什么已经修好了。

更新:(为了清楚起见添加了这一点,看看 SO 如何通知我这个 Q 获得了很多点击)事实证明,这些东西比我原先想象的更宽容,因为nil结果原来是(大部分?)我做的。 查看答案及其评论线程。 我还没有检查文档和示例是否更清晰。

https://developer.apple.com上的“证书、标识符和配置文件”中,当您转到“应用程序组”部分并首先生成您的应用程序组时,所需要的只是强制执行的 group.com.companyname.appname

只要 com.companyname.appname 与您在常规下为目标设置的捆绑标识符相匹配,您应该能够然后转到“功能”选项卡,打开“应用程序组”单击刷新符号和您的组刚刚在 Provisioning Portal 中创建的文件应该出现在那里,作为“group.com.companyname.appname”,您可以选择将其关闭,然后会出现权利错误。 单击“修复问题”应该会自动解决它。

现在,如果您导航到您的权利文件,您会注意到“com.apple.security.applications-groups”将有一个项目,它将被设置为完全相同的“group.com.companyname.appname”值。

我已经在设备上测试过,还没有问题。 这并不能解释文档中的不一致,但我可以保证这是有效的。

在提交我的应用程序的 macOS Sierra 版本时,我被 iOS 和 macOS 之间的不一致所困扰。

group.better.fyi 适用于 iOS 提交,但在 macOS 提交期间导致以下错误(否则运行良好,没有警告或错误):

ERROR ITMS-90286: "Invalid Code Signing Entitlements. Your application bundle's signature contains code signing entitlements that are not supported on macOS. Specifically, value '[group.better.fyi]' for key 'com.apple.security.application-groups' in 'ind.ie.Better-Mac.pkg/Payload/Better.app/Contents/PlugIns/Blocker-Mac.appex/Contents/MacOS/Blocker-Mac' is not supported. This value should be a string or an array of strings, each starting with your TEAMID followed by a dot '.' ."

在 App Groups 下的 Capabilities 选项卡中用$(TeamIdentifierPrefix)better.fyi替换它解决了这个问题。

当然,这会造成 iOS 和 Mac 应用程序之间的不一致。

TL;博士版本: https : //stackoverflow.com/a/66647419/15809
但是,如果您想了解这一切背后的所有细节,请参见下文。

IOS

在门户中,创建的所有应用组 ID 都必须以group.开头group. ; 门户实际上会强制执行此操作,因此甚至无法在没有该前缀的情况下在那里注册组。

如果然后在门户中的应用程序 ID 上设置应用程序组 ID 并为该应用程序 ID 创建 iOS 配置文件,则应用程序组将完全按照注册时的方式嵌入到配置文件中。 看看这样的配置文件,你会在那里找到应用程序组 ID。

如果 iOS 应用程序在其 codesign 授权文件中有应用程序组 ID,则 codesign 将确保在配置文件中也可以找到来自授权的组 ID,否则将拒绝签署应用程序。 因此,供应配置文件将这些应用程序组的使用列入白名单。

当您在 Xcode 中的功能部分为应用程序配置应用程序组 ID 时,Xcode 会为您将该 ID 放入代码设计授权文件中。 在那里为 iOS 应用程序配置的应用程序组必须与门户中注册的应用程序组 ID 完全匹配。

苹果系统

但是,对于 macOS,情况完全不同!

如果您将应用程序组 ID 添加到门户中的应用程序 ID,这不会影响为该应用程序 ID 创建的 macOS 配置文件。 自己看看; 在生成的配置文件中找不到应用程序组 ID! 因此,在 macOS 上,配置文件不会将任何应用程序组的使用列入白名单。 您可以将任何应用程序组 ID 放入您的权利文件中,这将始终签名,因为 codesign 不在乎。 Codesign 甚至不在乎您的应用程序组 ID 是否以您的团队 ID 为前缀(或者至少它过去没有使用过,也许现在是这样)。

与 iOS 不同,macOS 上应用程序组 ID 的唯一性不是由门户强制执行的,而是由 Apple 要求您的应用程序组 ID 以您的团队 ID 开头这一事实强制执行,因此跨团队的唯一性得到保证,并在您的应用程序中强制执行唯一性自己的团队是你自己的任务。

实际上,您根本不需要在门户中为 macOS 应用程序注册应用程序组 ID。 只需将您想要的应用程序组 ID 放入您的 Xcode 项目功能中,从而放入您的权利文件中就足够了。 许多人认为他们在门户中注册group.TEAM_ID.<whatever>时已经正确注册了他们的 macOS 应用程序组,并且一些魔法使这个组在没有group.情况下工作group. Mac 上的前缀,但事实并非如此。 他们刚刚注册了一个同名的 iOS 群组,而TEAM.<whatever>在 Mac 上运行的原因是因为该群组不需要在门户中注册。

现在有些读者会说:等一下; 如果我可以将任何应用程序组 ID 放入我的权利文件中并且它始终会签名,那么实际上是谁强制它以我的团队 ID 为前缀? Mac 应用商店。 Mac App Store 不允许您发布应用组 ID 未以发布者团队 ID 为前缀的应用。 如果您尝试,上传将失败。

应用程序组和安全性

您可能想知道:对于在应用商店之外分发的应用,谁强制要求应用组以您的团队 ID 为前缀? 没有人。 但是,在应用程序商店之外分发的应用程序可以声称是任何应用程序组的成员,甚至是来自不同开发团队的应用程序,那么这如何安全呢? 不是。 在应用程序商店之外分发的应用程序甚至不必经过沙盒处理,如果它们没有经过沙盒处理,它们就可以访问您的整个磁盘,包括所有应用程序的所有应用程序组文件夹,那么如果错误声明,安全性将如何降低成为应用程序组的成员?

如果出于安全原因,在应用商店之外分发的应用程序可能会被沙箱化,但即使他们选择加入,他们也可以根据需要或希望自由地在自己的沙箱中插入尽可能多的漏洞,因为与通过分发时不同在应用程序商店,没有任何审查可以确保他们只戳需要和合理的漏洞。

在 iOS 上,所有应用程序总是通过 App Store 进行沙盒化和分发,因此这个问题甚至不会出现。

应用程序组和钥匙串共享

钥匙串项目共享怎么样? 通过应用程序组共享钥匙串项目仅适用于 iOS,不适用于 macOS; 正是因为这个原因! 在 Mac 上会不安全。 在 macOS 上,仅与钥匙串访问组共享有效,并且那些在配置文件中,也在 macOS 配置文件中,并且对于这些代码,代码将始终强制配置文件在签署任何内容之前将它们列入白名单。

来自苹果的参考

您希望 Apple 直接确认所有这些吗? 当然,以下是我们最著名的 Apple 技术支持大师 Quinn 提供的参考:
https://developer.apple.com/forums/thread/133677?answerId=422887022#422887022

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM