我正在尝试构建一个在macOS上使用钥匙串共享的应用程序。但是,当尝试访问钥匙串数据时,它将显示以下对话框。
这会造成非常糟糕的用户体验,在这种情况下,用户被迫输入计算机密码才能使用该应用程序。
我在iOS上没有遇到此问题。
如何绕过此对话框?所有应用程序均由同一开发团队签署,因此我认为这不是问题。
答案 0 :(得分:2)
来自同一开发者的应用不会自动共享对钥匙串项目的访问权限;您必须明确设置某种共享策略。如何执行取决于该项目是存储在iCloud钥匙串中还是旧式钥匙串中。
对于iCloud钥匙串中的项目,您需要定义一个访问组,将应用添加到该组,然后将钥匙串项目的kSecAttrAccessGroup
属性设置为该组。有关详细信息,请参见Apple开发文档"Sharing Access to Keychain Items Among a Collection of Apps"。
对于非iCloud(旧式)钥匙串中的项目,您需要为每个项目定义一个访问控制列表,其中列出了应授予访问权限的每个应用程序以及访问类型。有关详细信息,请参见Apple开发文档"Access Contr Lists"。
注意:我认为问题中的对话框指示非iCloud钥匙串项目。如果输入密码并单击“始终允许”,它将添加一个访问控制条目,以授予该应用程序对该项目的访问权限。您可以在“钥匙串访问”实用程序中查看访问控制列表。
答案 1 :(得分:0)
使用新的钥匙串存储格式时,该格式还支持同步(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
使用旧格式时,您需要显式命名允许访问该项目的应用,并且需要指定允许它们执行哪些操作。