博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS 通讯录-获取联系人属性
阅读量:6832 次
发布时间:2019-06-26

本文共 4945 字,大约阅读时间需要 16 分钟。

内容均来自关东升老师的ios开发指南

上一篇写了联系人框架的一些必须知道的知识

如今写一下读取联系人数据相关操作

要读取通讯录数据库 须要

  1. 创建通讯录对象
  2. 查询获取数据(全部或者部分)
  3. 获取通讯录某一条记录(某个人的全部数据)
  4. 获取这个人的各种属性数据
就是这样
CFErrorRef error = NULL;    //创建一个通讯录操作对象    ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, &error);
第一參数是保留參数,传递NULL就可以;
//查找联系人- (void)filterContentForSearchText:(NSString *)searchText{    //推断授权状态    if (ABAddressBookGetAuthorizationStatus()!=kABAuthorizationStatusAuthorized) {        return ;    }    CFErrorRef error = NULL;    ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, &error);    if (searchText.length == 0) {        //查找全部        listContacts = CFBridgingRelease(ABAddressBookCopyArrayOfAllPeople(addressBook));    }    else{        //依据字符串查找前缀keyword        CFStringRef cfSearchText = (CFStringRef)CFBridgingRetain(searchText);        listContacts = CFBridgingRelease(ABAddressBookCopyPeopleWithName(addressBook, cfSearchText));        CFRelease(cfSearchText);    }    //这里应该刷新表格    [self.tableView reloadData];    CFRelease(addressBook);}
 
授权的状态:   kABAuthorizationStatusNotDetermined  用户还没有决定   kABAuthorizationStatusRestricted,	受限制   kABAuthorizationStatusDenied,	拒绝   kABAuthorizationStatusAuthorized	许可
 
联系人的属性
 
kABPersonFirstNameProperty;          // 名字kABPersonLastNameProperty;           // 姓氏kABPersonMiddleNameProperty;         // 中间名kABPersonPrefixProperty;             // 前缀kABPersonSuffixProperty;             // 后缀kABPersonNicknameProperty;           // 昵称kABPersonFirstNamePhoneticProperty;  // 名字的汉语拼音或者音标kABPersonLastNamePhoneticProperty;   // 姓氏汉语拼音或者音标kABPersonMiddleNamePhoneticProperty; // 中间名的汉语拼音或者音标kABPersonOrganizationProperty;       // 组织名kABPersonJobTitleProperty;           // 工作头衔kABPersonDepartmentProperty;         // 部门kABPersonNoteProperty;               // 备注kABPersonBirthdayProperty;           // 生日kABPersonCreationDateProperty;       // 创建时间kABPersonModificationDateProperty;   // 改动日期
 
//多值属性 (一个属性中又多个值) 有标签、值、id    kABPersonPhoneProperty ;        //电话号码属性           kABMultiStringPropertyType;//类型    kABPersonEmailProperty ;        //e-mail属性            kABMultiStringPropertyType;//类型    kABPersonURLProperty ;          //URL属性               kABMultiStringPropertyType;//类型    kABPersonRelatedNamesProperty;  // 亲属关系人属性         kABMultiStringPropertyType;//类型    kABPersonAddressProperty ;      //地址属性               kABMultiDictionaryPropertyType;//类型    kABPersonInstantMessageProperty;//及时聊天属性            kABMultiDictionaryPropertyType;//类型    kABPersonSocialProfileProperty; //社交账号属性            kABMultiDictionaryPropertyTypel;//类型
利用上面的属性来查找想要的值
以下是单值属性:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{    static NSString *CellIdentifier = @"Cell";    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];    if (cell) {        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];    }    //从搜索出的联系人数组中获取一条数据 转换为ABRecordRef格式    ABRecordRef thisPerson = CFBridgingRetain([listContacts objectAtIndex:[indexPath row]]);    //查找这条记录中的名字    NSString *firstName = CFBridgingRelease(ABRecordCopyValue(thisPerson, kABPersonFirstNameProperty));    firstName = firstName != nil? firstName:@"";    //查找这条记录中的姓氏    NSString *lastName = CFBridgingRelease(ABRecordCopyValue(thisPerson, kABPersonLastNameProperty));    cell.textLabel.text = [NSString stringWithFormat:@"%@%@",firstName,lastName];    CFRelease(thisPerson);    return cell;}
以下是多值属性的查找方法:
//获取多值属性- (void)multiValueProperty{    ABRecordID personRecordID = [personIDASNumber intValue];//personIDASNumber是NSNumber类型的值用来保存RecordID的值    CFErrorRef error = NULL;    ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, &error);    //通过ABRecordID属性找到ABRecord    ABRecordRef personRecord = ABAddressBookGetPersonWithRecordID(addressBook, personRecordID);    //通过ABRecord 查找多值属性    ABMultiValueRef emailProperty = ABRecordCopyValue(personRecord, kABPersonEmailProperty);    //将多值属性的多个值转化为数组    NSArray * emailArray = CFBridgingRelease(ABMultiValueCopyArrayOfAllValues(emailProperty));    for (int index = 0; index < emailArray.count; index++) {        NSString *email = [emailArray objectAtIndex:index];        NSString *emailLabel = CFBridgingRelease(ABMultiValueCopyLabelAtIndex(emailProperty, index));        //推断当前这个值得标签        if ([emailLabel isEqualToString:(NSString *)kABWorkLabel]) {            NSLog(@"%@", email);        }    }}
获取联系人图片:
//获取联系人的图片- (void)setImage{    CFErrorRef error = NULL;    ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, &error);    ABRecordRef cecordRef = ABAddressBookGetPersonWithRecordID(addressBook,[personIDASNumber intValue]);    //推断联系人是否有照片    if (ABPersonHasImageData(cecordRef)) {        //获取照片数据        NSData *photoData = CFBridgingRelease(ABPersonCopyImageData(cecordRef));        self.imageView.image = [UIImage imageWithData:photoData];    }}

转载地址:http://actkl.baihongyu.com/

你可能感兴趣的文章
通信服务器的架构问题
查看>>
所见即所得的游戏界面开发
查看>>
python 学习笔记 五
查看>>
Qt 乱码
查看>>
SpringMVC由浅入深day01_7入门程序小结
查看>>
three.js
查看>>
一个简单的统计图像主颜色的算法(C#源代码)
查看>>
java开发中的重中之重-------mysql(基础篇)
查看>>
While 나가는 법
查看>>
c语言操作符的优先级
查看>>
Codeforces Round #420 (Div. 2) A-E
查看>>
9.4-9.19 h5日记总结
查看>>
mysql支持的存储引擎
查看>>
input checkbox复选框取值
查看>>
SimpleAdapter
查看>>
一 python并发编程之多进程
查看>>
Socket通信
查看>>
less文件编译成微信小程序wxss文件
查看>>
viewport 学习
查看>>
jackson详解
查看>>