我正在尝试构建一个在macOS上使用密钥链共享的应用程序。但是,当尝试访问密钥链数据时,它会显示以下对话框。
这造成了非常差的用户体验,其中用户被迫输入他们的计算机密码才能使用应用程序。
我在iOS上没有遇到过这个问题。
如何绕过此对话框?所有的应用程序都是在同一个开发团队下签署的,所以我不认为这应该是一个问题。
发布于 2018-11-19 08:17:32
来自同一开发者的应用程序不会自动共享对密钥链项目的访问权限;您必须显式地设置某种共享策略。如何做到这一点取决于项是存储在iCloud密钥链中还是存储在旧式密钥链中。
对于iCloud密钥链中的项,您需要定义一个访问组,将您的应用程序添加到该组,并将您的密钥链项的kSecAttrAccessGroup
属性设置为该组。有关详细信息,请参阅苹果开发人员文档"Sharing Access to Keychain Items Among a Collection of Apps"。
对于非iCloud(旧式)密钥链中的项,您需要为每个项定义一个访问控制列表,该列表列出了应该授予访问权限的每个应用程序以及访问类型。有关详细信息,请参阅苹果开发人员文档"Access Contr Lists"。
注意:我认为问题中的对话框指示了一个非iCloud密钥链项目。如果您输入密码并单击"Always Allow",它将添加一个访问控制条目,授予该应用程序对该项目的访问权限。您可以在Keychain access实用程序中查看访问控制列表。
发布于 2020-09-03 17:33:50
当使用新的密钥链存储格式时,该格式也支持同步(iCloud密钥链),并且是iOS设备上唯一可用的存储格式,您只能通过密钥链访问组或应用程序组共享密钥链项目。当一个应用程序写了一个钥匙链项,并且它属于这样一个组时,属于同一组的所有其他应用程序都可以读取它,而不需要系统提示用户访问。
Apple在这个页面上记录了你需要知道的所有细节:
有关更多提示,请参阅我对此主题的以下回复:
https://stackoverflow.com/a/63728698/15809
当使用旧的密钥链存储格式时,其项是不可同步的,访问由SecAccessRef对象控制,该对象与每个密钥链项一起存储。有关详细信息,请参阅以下页面(特别是图像非常有用):
https://developer.apple.com/documentation/security/keychain_services/access_control_lists
https://developer.apple.com/documentation/security/1393522-secaccesscreate
使用旧格式时,您需要显式命名允许访问项目的应用程序,并指定允许它们执行的操作。
https://stackoverflow.com/questions/53365740
复制相似问题