保持对IOS AddressBook条目的长期引用

rob*_*lco 16 iphone objective-c ios

鉴于ABRecordID可以在云同步之间进行更改,并且在我无法控制的其他情况下,如何保持对IOS通讯簿记录的长期引用?

Apple提供以下指导:

"保持对特定记录的长期引用的推荐方法是除了标识符之外还存储名字和姓氏,或者名字和姓氏的哈希.当您按ID查找记录时,比较记录的名称为您存储的名称.如果它们不匹配,请使用存储的名称查找记录,并存储记录的新ID."

但我不明白这个指导.如果地址簿中可能包含重复的名称,并且由于用户可以修改记录中的名称,该建议如何工作?

例如,如果用户修改了地址簿记录的名称,我的例程将无法通过ABRecordID找到它,所以如果我认为通过我存储的名称哈希搜索不能找到重复的名称而不是新的ABRecordID用于该特定的记录我之前提到的?

最后,获得IOS AddressBook记录的长期参考的最佳方法是什么?如果上述建议确实有效,我错过了什么?

cle*_*bit 23

最强大(但并非完全失效)的方法是提出ABRecord字段的优先级排序,并将该列表中的ABRecordID与ABRecordID一起存储到您自己的(散列)私有记录格式中.检索私人记录时(或在其他方便的时间),您可以验证私人记录是否与ABRecord匹配,并通过一系列后备检查来确保其准确性.

优先级排序示例:

  1. ABRecordID
  2. 名字
  3. 电话号码
  4. 邮政编码

检索记录时,您可以先匹配ABRecordID.如果没有返回结果,您可以搜索FirstName + LastName.然后,您可以将这些结果与PhoneNumber......等进行匹配.通过这种方式,您可以区分2个Bob Smiths,因为他们可能有不同的电话号码(或者可能没有电话号码).当然,根据优先级列表的长度,这种机制会越健壮.

最后一种方法是提示用户区分2个Bob Smiths和全新ABRecordID的记录在其他方面完全相同 - 毕竟,这样一个不方便的提示比允许用户联系错误的Bob Smith(和正如我所说,将是最后的手段).

然而,针对AB的该解决方案可能涉及一些同步问题.

对于使用iOS Media Player的任何人来说,这都是一个熟悉的问题.特别MPMediaItems是在用户的音乐库中有一个属性MPMediaItemPropertyPersistentID,文档描述为:

不保证该值在同步/非同步/同步周期中持续存在.

换句话说,PersistentID不保证是持久的.解决方案包括对MediaItem属性执行类似的后备检查.