在iOS中 通讯录访问使用的是相对底层的C代码。
首先需要导入系统框架:AddressBook.framework
注意:
在程序第一次需要访问通讯录的时候,必须先询问系统是否允许当前程序访问通讯录,等待作答。iOS7以后,如果不写询问,可能崩溃。。
询问方法:参数 granted==YES,表示允许使用, granted==NO,表示不允许使用
ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) { }
在第二次访问通讯录(只要不是第一次访问)时,就可以使用下列方法,判断是否同意访问通讯录
if (ABAddressBookGetAuthorizationStatus() != kABAuthorizationStatusAuthorized) {
NSLog(@"不允许访问通讯录");
return;
}
//读取信息 - (void)readInfo { /** 访问系统的通讯录,需要导入系统框架:AddressBook.framework */ //报错 CFErrorRef error = NULL; //创建一个地址簿“对象” ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, &error); //第一个参数是预留参数,目前没用,未来官方会需要参数,就不用改原型了。 /** 注意: 第一次访问通讯录时,必须从先询问系统是否允许当前程序访问通讯录,等待作答。iOS7以后,如果不写询问,可能崩溃。。在这里,读取通讯录事第一次访问,所以加在这里,然后再添加联系人的时候(非第一次访问通讯录都可以这样):使用 if (ABAddressBookGetAuthorizationStatus() != kABAuthorizationStatusAuthorized) { NSLog(@"不允许访问通讯录"); } 但是,如果添加联系人是第一次访问通讯录,那么则必须先询问。 ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) { } */ ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) { //当用户选择了是否允许,回调这个方法 if (granted == YES) { //允许 //访问通讯录 //获取通讯录中的名片 //获取所有人 CFArrayRef arrayRef = ABAddressBookCopyArrayOfAllPeople(addressBook); //导入OC数组 NSArray * array = CFBridgingRelease(arrayRef); //找出一个人 ABRecordRef person = CFBridgingRetain(array[0]); //凡是bridgingRetain创建的Ref,用完需要释放 //从人中取出相应的信息 /*取出单一值的信息*/ //这里取出联系人的名字 NSString * name = CFBridgingRelease(ABRecordCopyValue(person, kABPersonLastNameProperty)); NSLog(@"%@", name); //获取这些信息 // kABPersonFirstNameProperty //名 // kABPersonLastNameProperty //姓 // kABPersonMiddleNameProperty //中间名 // kABPersonPrefixProperty //前缀 // kABPersonSuffixProperty //后缀 // kABPersonNicknameProperty //昵称 // kABPersonFirstNamePhoneticProperty //名的汉语拼音或者音标 // kABPersonLastNamePhoneticProperty //姓的汉语拼音或者音标 // kABPersonMiddleNamePhoneticProperty //中间名的汉语拼音或者音标 // kABPersonOrganizationProperty //组织名 // kABPersonJobTitleProperty //头衔 // kABPersonDepartmentProperty //部门 /*获取多值属性,如email,phoneNumber*/ //获取Email ABMultiValueRef mutiValueRef = ABRecordCopyValue(person, kABPersonEmailProperty); NSArray * emails = CFBridgingRelease(ABMultiValueCopyArrayOfAllValues(mutiValueRef)); //通过这个方法转成数组,数中就是想要的字符串了 NSLog(@"%@", emails); //获取电话号码 ABMultiValueRef mutiValueRef2 = ABRecordCopyValue(person, kABPersonPhoneProperty); NSArray * phoneNumbers = CFBridgingRelease(ABMultiValueCopyArrayOfAllValues(mutiValueRef2)); //通过这个方法转成数组,数中就是想要的字符串了 NSLog(@"%@", phoneNumbers); //这里可以区分电话的种类 for(int index = 0; index< phoneNumbers.count; index++){ NSString * phoneNumber = [phoneNumbers objectAtIndex:index]; NSString * phoneNumberLabel = CFBridgingRelease(ABMultiValueCopyLabelAtIndex(mutiValueRef2, index)); if ([phoneNumberLabel isEqualToString:(NSString*)kABPersonPhoneMobileLabel]) { NSLog(@"手机电话%@", phoneNumber); } else if ([phoneNumberLabel isEqualToString:(NSString*)kABPersonPhoneIPhoneLabel]) { NSLog(@"iPhone电话%@", phoneNumber); } else { NSLog(@"其他电话%@", phoneNumber); } } CFRelease(person); CFRelease(mutiValueRef); CFRelease(mutiValueRef2); } else { //不许 //释放addressbook CFRelease(addressBook); return; } }); //千万不可在这里释放。为啥?因为这里的代码比block中的代码先调用。 }
//向通讯录添加一个人 - (void)addContract { //在该程序任何处均可通过下面代码判断通讯录是否允许访问 if (ABAddressBookGetAuthorizationStatus() != kABAuthorizationStatusAuthorized) { NSLog(@"不允许访问通讯录"); return; } //打开通讯录 ABAddressBookRef iPhoneAddressBook = ABAddressBookCreateWithOptions(NULL, NULL); //新建一个联系人 ABRecordRef newPerson = ABPersonCreate(); //设置联系人的信息 /*设置单一值得信息*/ CFErrorRef error = NULL; //设置联系人的姓 ABRecordSetValue(newPerson, kABPersonFirstNameProperty, @"野原", &error); //设置联系人的名 ABRecordSetValue(newPerson, kABPersonLastNameProperty, @"新之助", &error); //设置昵称 ABRecordSetValue(newPerson, kABPersonNicknameProperty, @"蜡笔小新", &error); /*设置多值得信息*/ //设置电话号码 //初始化电话引用 ABMutableMultiValueRef multiPhone = ABMultiValueCreateMutable(kABMultiStringPropertyType); //设置了连续三个电话号码,分别对应三个电话类型 ABMultiValueAddValueAndLabel(multiPhone, @"1-555-555-5555", kABPersonPhoneIPhoneLabel, NULL); ABMultiValueAddValueAndLabel(multiPhone, @"1-123-456-7890", kABPersonPhoneMobileLabel, NULL); ABMultiValueAddValueAndLabel(multiPhone, @"1-987-654-3210", kABOtherLabel, NULL); //添加到联系人 ABRecordSetValue(newPerson, kABPersonPhoneProperty, multiPhone, &error); //联系人添加到通讯录 ABAddressBookAddRecord(iPhoneAddressBook, newPerson, &error); //同步通讯录 ABAddressBookSave(iPhoneAddressBook, &error); if (error != NULL) { NSLog(@"添加失败"); } else { NSLog(@"添加成功"); } CFRelease(iPhoneAddressBook); CFRelease(newPerson); CFRelease(multiPhone); }
//从通讯录中,删除一个联系人 - (void)removeAContract { //在该程序任何处均可通过下面代码判断通讯录是否允许访问 if (ABAddressBookGetAuthorizationStatus() != kABAuthorizationStatusAuthorized) { NSLog(@"不允许访问通讯录"); return; } //打开通讯录 ABAddressBookRef iPhoneAddressBook = ABAddressBookCreateWithOptions(NULL, NULL); //返回所有联系人到一个数组中 CFArrayRef personArray = ABAddressBookCopyArrayOfAllPeople(iPhoneAddressBook); //找出数组的一个元素 ABRecordRef deletePerson = CFArrayGetValueAtIndex(personArray, 7); //遍历数组,找到匹配的姓名,或匹配的电话,来确定被删除的人,这里就直接删除第7个。 CFErrorRef error = NULL; //删除联系人 ABAddressBookRemoveRecord(iPhoneAddressBook, deletePerson, &error); if (error) { NSLog(@"%@", error); } //同步通讯录 ABAddressBookSave(iPhoneAddressBook, &error); if (error != NULL) { NSLog(@"删除失败"); } else { NSLog(@"删除成功"); } CFRelease(personArray); // CFRelease(deletePerson); }