ios - 使用 ABAddressBookRegisterExternalChangeCallback 注册的地址簿更改回调永远不会被调用 (iOS 8)

标签 ios objective-c iphone ios8 abaddressbook

我已经找到了很多与此相关的示例,但在阅读整个 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/

相关文章:

ios - 处理 Firebase + Facebook 登录流程

ios - 我想更新我的 tableview 静态单元格,我该如何更新它?

ios - CollectionView dequeCell 从单元格中删除 subview 使 View 显得缓慢

Objective-C 和 ASIHTTPRequest 返回值

iphone - 如何在 objective-c 中使用xmpp框架显示用户头像图像?

iphone - 如何在MKMapView上用MKOverlayView绘制圆弧/曲线

ios - 如何在 Swift 中将文件写入位于 Apple 的文件应用程序中的文件夹

ios - 定义一个不会被取消引用的委托(delegate)?

ios - 获取自定义 uitableViewCell 的阴影?

iphone - cocos2d中如何制作双目效果?