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

标签 iphone ios objective-c

鉴于 ABRecordID 可以在云同步之间以及在我无法控制的其他情况下发生变化,我如何维护对 IOS 通讯簿记录的长期引用?

Apple 提供以下指导:

“保留对特定记录的长期引用的推荐方法是,除了标识符之外,还存储名字和姓氏,或者名字和姓氏的哈希值。当您通过以下方式查找记录时ID,将记录的名称与您存储的名称进行比较。如果它们不匹配,则使用存储的名称查找记录,并为记录存储新的 ID。”

但是我不明白这个指南。如果地址簿中可以有重复的名字,并且由于用户可以修改记录中的名字,这个建议怎么会起作用?

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

最后,获得 IOS AddressBook 记录的长期引用的最佳方法是什么?如果上述建议确实有效,我还缺少什么?

最佳答案

最稳健(但并非完全故障安全)的方法是提出 ABRecord 字段的优先级排序,并从该列表中尽可能多地存储可用的 ABRecordID,并将其存储到您自己的(散列的)私有(private)记录格式中.检索私有(private)记录时(或在其他方便的时间),您可以验证私有(private)记录是否与 ABRecord 匹配,并通过一系列后备检查来确保其准确无误。

示例优先级排序:

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

检索记录时,您可以先匹配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/

相关文章:

iphone - jquery mobile 按钮无法正确显示

iphone - 为此方法自定义 UITableViewCell 的手动布局?

ios - 选择 UITextField 时向上移动 UIView

ios - 请求被服务委托(delegate) (SBMainWorkspace) 拒绝,原因为 : Unspecified

ios - 第二次点击单元格时如何折叠展开的单元格?

iphone - 尝试使用 MPMoviePlayer 时出现链接器错误

iOS Spotify 歌曲链接

ios - 如何复制 iOS 键盘外观?

ios - YouTube视频停止在iPhone上运行-黑屏

iphone - 当应用程序已经运行时将本地通知声音静音