我已经找到了很多与此相关的示例,但在阅读整个 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];
}
我看到日志输出注册回调
,但从未看到地址簿更改
。
最佳答案
实际上ABAddressBook
的代码是用C编写的。因此您在使用原始ABAddressBook框架时可能会遇到困难。
所以我建议使用第三方库(这只是 C 到 Obj-C 的改造)来访问联系人和联系人更改。
这是一个流行库的链接 https://github.com/Alterplay/APAddressBook
使用上述框架,您可以轻松观察地址簿中的变化。
观察地址簿外部变化
// start observing
[addressBook startObserveChangesWithCallback:^
{
NSLog(@"Address book changed!");
}];
// stop observing
[addressBook stopObserveChanges];
这个库还有很多选项,如排序、过滤等。
关于ios - 使用 ABAddressBookRegisterExternalChangeCallback 注册的地址簿更改回调永远不会被调用 (iOS 8),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28921640/