• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

ios - 访问 ABAddressBook 时出错

[复制链接]
菜鸟教程小白 发表于 2022-12-13 08:54:37 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我正在使用以下代码访问 ABAddressBook:

+ (void)connectToAddressBook {
    if(!_addressBook)
    {
        CFErrorRef error;
        _addressBook = ABAddressBookCreateWithOptions(NULL, &error);
        NSLog(@"Address book %@", _addressBook);

        if (error != nil) {
            NSLog(@"ERROR WHILE ACCESSING ADDRESS BOOK: %@", CFBridgingRelease(error));
            CFRelease(error);
        }

        if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusNotDetermined) {
            ABAddressBookRequestAccessWithCompletion(_addressBook, ^(bool granted, CFErrorRef error) {
                _isAccessToContactsAllowed = granted;
            });
        }
        else if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusAuthorized) {
            _isAccessToContactsAllowed = YES;
        }
        else {
            _isAccessToContactsAllowed = NO;
        }
    }
}

地址簿打开正常,但由于某种原因错误不是 nil 并记录当前类的名称:

ERROR WHILE ACCESSING ADDRESS BOOK: MyContactManager

为什么error不为零?我的代码有什么错误吗?在发生真正错误的情况下,如何检测并停止尝试访问地址簿?



Best Answer-推荐答案


感谢 Ilesh 的反馈,这是我的固定方法:

+ (void)connectToAddressBook {
    if(!_addressBook) {
        CFErrorRef *error = nil;
        _addressBook = ABAddressBookCreateWithOptions(NULL, error);

        // To test if error is not nil:
        //error = CFErrorCreate(NULL, CFSTR("Hello, world."), 111, NULL);

        if (error != nil) {
            NSLog(@"ERROR WHILE ACCESSING ADDRESS BOOK: %@", CFBridgingRelease(error));
            CFRelease(error);
        }
        else {
            if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusNotDetermined) {
                ABAddressBookRequestAccessWithCompletion(_addressBook, ^(bool granted, CFErrorRef error) {
                    _isAccessToContactsAllowed = granted;
                });
            }
            else if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusAuthorized) {
                _isAccessToContactsAllowed = YES;
            }
            else {
                _isAccessToContactsAllowed = NO;
            }
        }
    }
}

编辑:

看来我最初的错误是没有将错误分配给nil。通讯簿创建不会设置错误除非确实存在错误。所以我未分配的变量指向内存中的某个随机位置,这就是我第一次尝试时出现随机错误的原因。

更重要的是,ABAddressBookCreateWithOptions如果有错误会返回nil,所以正确的做法是:

if(_addressBook) {
    // do something
}
else {
    // there is an error
}

关于ios - 访问 ABAddressBook 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31200787/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap