9

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

是否有一种简单的方法/最佳实践来确定在重新启动应用程序之前更改了哪些地址簿联系人?

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

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

谢谢!

4

2 回答 2

2

您必须使用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];

}
于 2014-08-17T09:44:08.950 回答
1

研究使用 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

于 2014-06-03T13:22:32.407 回答