【问题标题】:iOS Address Book - How To Know Which Contact Was Added/Edited/Deleted?iOS 通讯簿 - 如何知道添加/编辑/删除了哪个联系人?
【发布时间】:2012-09-17 08:16:18
【问题描述】:

我的应用需要在我们的服务器上存储用户的联系人(当然是在用户许可的情况下)。其中一项要求是将设备通讯录上的任何更改(添加/编辑/删除)反映到服务器。

关于在重新启动应用程序之前确定哪些通讯录联系人已更改,是否有简单的方法/最佳做法?

我所看到的只是通知应用程序地址簿更改的回调方法,但似乎没有记录的方法来确定添加、编辑或删除哪些联系人。

我现在想的是手动将新的联系人列表与存储在设备上的联系人列表进行比较,然后更新应用程序和服务器的更改。但是我认为如果用户有大量的联系人,这可能太多了。

谢谢!

【问题讨论】:

标签: ios objective-c abaddressbook


【解决方案1】:

您必须使用 ABAddressBookRegisterExternalChangeCallback 注册您的课程,并传递一个 ABAddressBookRef 和回调(在我的示例中为“addressBookDidChange”)

ABAddressBookRef addressBook = //...

ABAddressBookRegisterExternalChangeCallback(addressBook, addressBookDidChange(__bridge_retained  void *)self);

void addressBookDidChange(ABAddressBookRef addressBook, CFDictionaryRef info, void  *context)
{
    //Something changed from last application launch, insert your logic here...

    //If you want to handle it in a "Objective-C" method you can do something like:
    [((__bridge ABManager*) context) yourObjectiveCMethod];

}

【讨论】:

  • 它告诉通讯录发生了一些事情仍然没有回答 - 添加/编辑/删除了哪个联系人?
  • @VenuGopalTewari 可以保存之前的联系人,然后与回调addressBookDidChange中提取的联系人进行比较
  • 您能否提出一些好的逻辑或一些示例或任何示例代码。
【解决方案2】:

研究使用 libsqlite3.dylib 并创建一个 sql 数据库,该数据库将访问为所有需要的属性生成的平面文件,然后定期将您的数据库与用户的设备进行比较。确保这两个数据库仅从 abaddressbook 框架中获取您需要的基本必需品。

带有 sqlite3 库的示例 iOS 项目在这里:

http://www.techotopia.com/index.php/An_Example_SQLite_based_iOS_7_Application

& 在此处使用 ABAddressbook 为联系人的多值属性执行此操作的详细信息:

http://linuxsleuthing.blogspot.com/2012/10/addressing-ios6-address-book-and-sqlite.html

【讨论】:

  • 这不是每次迭代联系人的理想方式。最好使用ABAddressBookRegisterExternalChangeCallback
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多