如何创建联系人(ABPerson)而不将其存储在地址簿中?

时间:2014-08-20 22:11:48

标签: ios abaddressbook abrecord

我的目标是允许用户使用标准UI(ABPersonViewController)创建联系人,但允许他们选择将其添加到地址簿或将其存储在本地(在我的CoreData数据库中) 。因此,我需要执行以下操作之一:

  • 将ABRecord的副本作为NSData存储在我自己的数据库中,并始终使用该副本。
  • 存储ABRecord的表示(vCard,专有格式,其他...),并在用户想要编辑联系人时转换为/从该表示转换(以便提供ABRecord到ABPersonViewController)。

我的问题是我无法想出一种创建记录的方法,而无需将其添加到用户的地址簿中。

一些背景

iOS地址簿编程指南 link here)中,Apple的文档说明:

  

即使记录通常是地址簿数据库的一部分,   它们也可以存在于它之外。这使它们成为一种有用的方法   存储您的应用程序正在使用的联系信息。

当然,这听起来非常适合我需要做的事情。但它没有提供有关在地址簿之外创建ABRecords的方法的任何说明。

API似乎只提供了在指定源(ABPersonCreateInSource)或默认源(ABPersonCreate)中创建的方法。最重要的是,虽然the documentation说要调用ABAddressBookAddRecord将创建的记录添加到地址簿,但我的测试显示该记录仍然被添加! (也许它是由ABPersonViewController添加的,我还没有检查过。)

我在互联网上搜索了很多,虽然有些人提出了类似的问题,但似乎没有人以实际工作的方式回答;-)

但是我已经看过几个应用程序这样做,所以我确信这是可能的。

我的问题:你会怎么做?

1 个答案:

答案 0 :(得分:1)

如果您不想在地址簿中添加地址,则在使用AddressBook.framework时,只需创建记录(例如ABPersonCreate),但不要调用ABAddressBookAddRecord后跟{ {1}},它不会存储在您的地址簿中。只有在您明确添加和保存记录时,它才会存储在您的地址簿中。

但是,正如您所推测的那样,如果您使用ABAddressBookSave(在AddressBookUI.framework中编辑并保存记录或从ABPersonViewController保存记录),则保存在地址簿中。

如果您真的想使用ABNewPersonViewController,理论上可以使用AddressBookUI.framework,然后使用ABNewPersonViewController方法ABNewPersonViewControllerDelegatenewPersonViewController:didCompleteWithNewPerson:不是ABRecordRef,您可以使用NULL删除该记录并通过ABAddressBookRemoveRecord保存,并删除添加的记录。这对我来说是一种特别不优雅的方法,但它确实有效。

但是,如果您不需要ABAddressBookSave,那么您可以非常轻松地创建AddressBookUI.framework条记录,而不是明确地将它们添加到地址簿中,您就可以了。