首先,一切的前提是你添加通讯录的语句没有任何错误。
然后就是
// 将新建的联系人添加到通讯录中
ABAddressBookAddRecord(addressBook, person, NULL);
下一步保存通讯录 为了大家更好的学习处理这种不会导致崩溃和提示的报错 建议大家创建一个Error对象来看看系统给出的错误提示
CFErrorRef error = NULL;
if(ABAddressBookSave(addressBook, &error))
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示" message:@"已成功将联系人导入通讯录" delegate:self cancelButtonTitle:@"确认" otherButtonTitles:nil];
[alert show];
}
else
{
NSLog(@"%@",error);
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示" message:@"导入失败" delegate:self cancelButtonTitle:@"确认" otherButtonTitles:nil];
[alert show];
}
输出的error:The error is "Error Domain=ABAddressBookErrorDomain Code=1 "The operation couldn’t be completed. (ABAddressBookErrorDomain error 1.)"
这个错误的大致意思就是说操作未完成,其实对我是没有任何作用的,但是至少这个错误告诉了我们一件事,就是我们写的代码不存在任何问题。既然代码没有问题,那为什么将联系人保存到通讯录会失败呢? 答案似乎只有一种可能 就是系统不允许你访问通讯录
解决办法:首先在手机的隐私设置,通讯录隐私看看权限是否打开。
然后在导入之前先给出一个请求应用访问通讯录的代码。
if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusNotDetermined) {
ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) {
第一次的时候系统就会弹出一个提示框告诉用户是否允许该应用访问通讯录
});
}
else if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusAuthorized) {
说明可以访问
}
else {
可能是用户关闭了访问通讯的权限。
}
好了,关于通讯录不能保存数据的问题终于解决了。