鉴于 ABRecordID 可以在云同步之间以及在我无法控制的其他情况下发生变化,我如何维护对 IOS 通讯簿记录的长期引用?
Apple 提供以下指导:
“保留对特定记录的长期引用的推荐方法是,除了标识符之外,还存储名字和姓氏,或者名字和姓氏的哈希值。当您通过以下方式查找记录时ID,将记录的名称与您存储的名称进行比较。如果它们不匹配,则使用存储的名称查找记录,并为记录存储新的 ID。”
但是我不明白这个指南。如果地址簿中可以有重复的名字,并且由于用户可以修改记录中的名字,这个建议怎么会起作用?
例如,如果用户修改地址簿记录的名称,我的例程将无法通过 ABRecordID 找到它,所以如果我认为通过我存储的名称哈希进行搜索,我无法找到重复的名称而不是新的 ABRecordID对于我之前引用的那条特定记录?
最后,获得 IOS AddressBook 记录的长期引用的最佳方法是什么?如果上述建议确实有效,我还缺少什么?
最佳答案
最稳健(但并非完全故障安全)的方法是提出 ABRecord 字段的优先级排序,并从该列表中尽可能多地存储可用的 ABRecordID,并将其存储到您自己的(散列的)私有(private)记录格式中.检索私有(private)记录时(或在其他方便的时间),您可以验证私有(private)记录是否与 ABRecord 匹配,并通过一系列后备检查来确保其准确无误。
示例优先级排序:
- ABRecordID
- 名字
- 姓氏
- 电话号码
- 邮政编码
检索记录时,您可以先匹配ABRecordID
。如果没有返回任何结果,您可以搜索 FirstName + LastName
。然后,您可以将这些结果与 PhoneNumber
... 等进行匹配。通过这种方式,您可以区分 2 个 Bob Smiths,因为他们可能有不同的电话号码(或者一个人可能没有电话号码)。当然,根据您的优先级列表的长度,此机制将越强大。
最后的手段是提示用户区分 2 个具有全新 ABRecordID
的 Bob Smiths,他们的记录在其他方面是相同的——毕竟,这样一个不方便的提示会比允许用户联系错误的 Bob Smith(正如我所说,这将是最后的手段)。
但是,此 AB 解决方案可能涉及一些同步问题。
对于使用过 iOS Media Player 的任何人来说,这是一个熟悉的问题。具体来说,用户音乐库中的 MPMediaItems
有一个属性 MPMediaItemPropertyPersistentID
,文档将其描述为:
The value is not guaranteed to persist across a sync/unsync/sync cycle.
换句话说,PersistentID
不保证是持久的。解决方案包括对 MediaItem
属性进行类似的回退检查。
关于iphone - 保持对 IOS AddressBook 条目的长期引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14763688/