我已经找到了很多与此相关的示例,但在阅读整个 ABAddressBook 文档后,我仍然无法弄清楚为什么在我的情况下,我的更改回调没有被调用。我只是设置了一个地址簿并为其注册了一个回调函数。
我可以很好地访问地址簿,但无论我在“联系人”应用程序中更改多少联系人,然后重新打开我的应用程序,都永远不会调用回调函数。有什么理由永远不会调用回调吗?我已经确保不会释放地址簿或取消注册回调。
初始化代码:
// Set up address book API.
CFErrorRef *error = NULL;
_addressBook = ABAddressBookCreateWithOptions(NULL, error);
if (error) {
NSLog(@"Could not initialize address book: %@", CFBridgingRelease(CFErrorCopyFailureReason(*error)));
} else {
ABAddressBookRegisterExternalChangeCallback(_addressBook, RogerAddressBookChangeCallback, (__bridge void *)self);
NSLog(@"Registered callback");
}
回调函数:
void RogerAddressBookChangeCallback(ABAddressBookRef addressBook, CFDictionaryRef info, void *context) {
NSLog(@"Address book change");
ABAddressBookRevert(addressBook);
RogerAddressBook *instance = (__bridge RogerAddressBook *)context;
[instance import];
}
我看到日志输出Registered callback
但从来没有Address book change
.
实际上代码为ABAddressBook
是用 C 编写的。因此您可能会在使用原始 ABAddressBook 框架时遇到困难。
因此,我建议使用第三方库(这只是 C 到 Obj-C 的改造)来访问联系人和联系人更改。
这是一个流行图书馆的链接https://github.com/Alterplay/APAddressBook https://github.com/Alterplay/APAddressBook
使用上面的框架你可以很容易地观察到地址簿的变化。
观察通讯录外部变化
// start observing
[addressBook startObserveChangesWithCallback:^
{
NSLog(@"Address book changed!");
}];
// stop observing
[addressBook stopObserveChanges];
这个库还有很多选项,如排序、过滤等。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)