iOS钥匙串中的项目是否在应用卸载和重新安装后生存?

39

我正在寻找有关iOS钥匙串项目的文档。我的具体问题是,钥匙串项目是否会在应用卸载和重新安装周期中幸存。

自iOS 4(甚至可能是iOS 3)以来似乎是这样工作的,但我找不到任何Apple的文件说明它实际上应该是这样工作的。

我试图弄清楚的是,我能否信任(而不是“希望”或“猜测”)钥匙串中的项目将幸存于应用程序的卸载之后。

编辑:如Daij-Djan所指出的那样,我的问题有点不清楚。我正在寻找支持众所周知行为的官方文档。

更新2017-04-04:请参见下面的答案,在iOS 10.3 beta中更改了该行为。它在iOS 10.3中像往常一样工作,但在未来版本中可能会发生变化。


我们从经验中知道这是事实,但我在Keychain Services编程指南或WWDC 2010会议209保护应用程序数据的演讲中未能找到苹果公司的任何文档。 - Jano
我觉得这很有趣,在我戴上锡纸帽子的时候,我想象苹果之所以不记录这个行为,是因为他们可以根据自己的意愿来改变(而且很可能会改变)这个行为(这也很奇怪,他们以前在iOS中已经改变了不同的行为)。只是看起来很奇怪,一个众所周知的行为竟然没有官方文档。 - Andreas Paulsson
1
为什么要踩我?请解释一下,这样我才能改进问题。 - Andreas Paulsson
3个回答

21
我在苹果开发者论坛上查找了一下,一位苹果开发者(eskimo1,也称为Quinn)在2012年8月27日表示这是当前的行为,但据他所知这不是/记录在案/的行为,因此这可能会在未来发生改变。他还说删除共享钥匙串项目始终是棘手的问题之一,这也是尚未解决的原因之一。
所以我想这留下了一个问题:没有明确的答案。它没有记录并且可能随时更改。依赖它可能会在未来引起问题。 更新于2017-04-04: 在iOS 10.3测试版中,当应用程序被卸载时,钥匙串信息会被删除,但是这种行为似乎在最终的10.3版本中已经被取消了。在苹果文档中建议我们不要依赖于应用程序卸载后钥匙串访问数据的完整性。 另请参阅iOS 10.3 beta 3 doesn't persist data of KeychainItem

2
很好的发现 - 只是提醒一下,Eskimo在2015年10月15日的论坛中重申了这个指导(“确实。这种行为更多地是实现的产物,而不是设计上的特性[...]你真正需要问的问题是,如果这种行为改变了,我的风险是什么?”) - Peter E
@sherb 这很奇怪,我刚在 iOS 11.03 上测试了我们应用程序(这个供应商唯一的应用程序)的卸载 - 安装场景,并且钥匙链条目没有被删除。我们正在使用 kSecAttrAccessibleWhenUnlockedThisDeviceOnly 存储通用密码,您是如何存储条目的? - Andreas Paulsson
4
@AndreasPaulsson:你是正确的。我错误地编写了测试并得到了一个虚假的负面结果。截至iOS 11.0.3,似乎在删除应用程序后钥匙串数据确实会保留。为避免混淆任何人,我已经删除了之前的评论。 - sherb

7
也许这正是你在寻找的内容。
苹果文档

注意:在iPhone上,钥匙串权限取决于用于签署应用程序的预配文件。请确保在应用程序的不同版本中始终使用相同的预配文件。


1
我已经阅读过这个内容,但没有找到任何说明关键链项目将在应用卸载后得以保存。你能找到相关资料吗?我正在寻找一份来自官方文档的引用。 - Andreas Paulsson
6
对我而言,以下文本间接地暗示了这一点:“注意:在 iPhone 上,Keychain 权限取决于用于签署您的应用程序的配置文件。请务必在不同版本的应用程序中始终使用相同的配置文件。”这意味着,如果您删除了旧版本的应用程序并安装了较新版本,只要开发人员使用了相同的配置文件,那么后来新安装的应用程序将能够访问同样的 Keychain 数据。 - user523234
6
我确认了这种行为,但我有一个疑问,如果配置文件过期了并得到更新,会发生什么?可以有人确认一下吗? - Nimit Pattanasri
@NimitPattanasri 我可以确认,一个过期和更新的配置文件不会影响行为,它的 keychain 项仍将存储。 - Andreas Paulsson

6

是的,我知道它目前是这样工作的,但是你的回答并没有回答我的问题。我想知道我是否可以依赖它,为此我希望有一些来自苹果的文档,说明这是正确的情况。 - Andreas Paulsson
我明白你的意思,但引用一下:“我的具体问题是钥匙串项目是否会在应用卸载和重新安装周期中存活” :D - Daij-Djan
抱歉,我已经编辑了我的问题,使其更加清晰明了。 - Andreas Paulsson
2
关于您关于应用程序之间共享的补充:这是由访问组(keychain-access-groups)定义的,iOS可能会保留引用计数,以便可以访问它们的已安装应用程序的钥匙串项被删除(类似于持久UIPasteboard)。我同意它很可能不会被删除,但我找不到文件说明它们保证不会被删除。接近了,但还差一点 :-). - Andreas Paulsson
4
五年后,所有的东西都保持不变,钥匙链在应用卸载后仍然存在。 - Daij-Djan
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接