iOS 通讯录-获取联系人属性

内容均来自关东升老师的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{
        //根据字符串查找前缀关键字
        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];
    }
}

时间: 2024-12-29 17:29:19

iOS 通讯录-获取联系人属性的相关文章

Android软件开发之通讯录——添加联系人以及SQLite工具的简单使用

关于通讯录获取联系人信息以及联系人信息的存储结构,下面链接的博客的博主已经简单说明: http://blog.csdn.net/snwrking/article/detail/7601794 ---------------------------------------------------------------------------------------------------------------------------------- 回归正题,我是用真机进行测试,首先先用数据线连

iOS中获取本地通讯录联系人以及汉字首字母排序

/***  加载本地联系人*/ - (void)loadLocalContacts { //新建一个通讯录类 ABAddressBookRef addressBooks = nil; if (DeviceVersion < 6.0) { addressBooks = ABAddressBookCreate(); } else { addressBooks =  ABAddressBookCreateWithOptions(NULL, NULL); //获取通讯录权限 dispatch_semap

仿IOS通讯录效果,实现获取手机通讯录、字母排序显示、搜索联系人、拨打电话

1.使用UITableView,实现联系人字母排序.点击字母跳转显示联系人组目录: 2.使用UISearchController,实现联系搜索,动态显示符合查询的联系人: 3.点击通讯录列表项,显示联系人信息(使用自定义模式化窗口类似与UIAlertView,使用UIwindow实现),点击拨号,可以直接拨打电话: 4.实现获取手机通讯录里面的联系人信息: 详情见资源:http://download.csdn.net/detail/u011622479/9505751 效果图如下: 获取联系人:

iOS开发------获取系统联系人(AddressBook篇)

AddressBook是Apple提供给我们获取系统联系人的一个很方便类库,与其说方便,其实刚开始还是比较崩溃的,从开发文档来看,它还是偏向于C语言,并且不在ARC的控制之下,虽然在iOS9.0之后会被Contacts.framework替代,但在工作中要对最低版本进行兼容,了解一下这个类库还是很有必要的.这里就介绍一下获取联系人信息的那些方法,对于修改,添加删除等操作,想留在下一篇介绍AddressBookUI这个类库的时候来写一下. 代码GitHub:https://github.com/Y

iOS 获取联系人,并调用系统地址簿UI

1.加入 AddressBook库 推断授权状态 -(bool)checkAddressBookAuthorizationStatus { //取得授权状态 ABAuthorizationStatus authStatus = ABAddressBookGetAuthorizationStatus(); if (authStatus !=kABAuthorizationStatusAuthorized) { returnNO; }else{ returnYES; } } 注冊 通讯录变更通知 -

weiyi通讯录(二)获取联系人信息包括头像 增删改查功能,

看了下第一期的访问量,100都没有可能很多人不需要吧,之前跟过一个大神学做项目,他都不吧核心代码告诉我,感觉没有一点分享精神,所以我就自己做.没跟他一起做 这里把上次的代码分享一下 我这里分享的跟我博客里面可能不一样因为我已经做完第一个模块了,代码就没有分开了 第一期的代码地址:http://download.csdn.net/detail/u010982856/8232855 分享的是类似的代码 基本跟我的是一样.如果需要的联系人我把 或者加入我的交流群吧 -----------欢迎加入交流群

ContentProvider往通讯录添加联系人和获取联系人

在Android中,可以使用ContentResolver对通信录中的数据进行添加.删除.修改和查询操作. 在对联系人进行操作时需加入以下两个权限 <!-- 添加操作联系人的权限 --><uses-permission android:name="android.permission.READ_CONTACTS" /><uses-permission android:name="android.permission.WRITE_CONTACTS&

Android通讯录管理(获取联系人、通话记录、短信消息)(二)

http://blog.csdn.net/wwj_748/article/details/19970271 Android通讯录管理(获取联系人.通话记录.短信消息)(二) 2014-02-26 11:40 9076人阅读 评论(11) 收藏 举报  分类: [Android通讯录模块开发](10)  版权声明:本文为博主原创文章,未经博主允许不得转载. Android通讯录管理(获取联系人.通话记录.短信消息)(二) 前言:上一篇博客介绍的是获取联系人的实现,本篇博客将介绍通话记录的实现. 同

IOS 通讯录 (访问,添加,修改)

如何访问用户的通讯录 在iOS中,有2个框架可以访问用户的通讯录 AddressBookUI.framework 提供了联系人列表界面.联系人详情界面.添加联系人界面等 一般用于选择联系人 AddressBook.framework 纯C语言的API,仅仅是获得联系人数据 没有提供UI界面展示,需要自己搭建联系人展示界面 里面的数据类型大部分基于Core Foundation框架,使用起来极其蛋疼 从iOS6开始,需要得到用户的授权才能访问通讯录,因此在使用之前,需要检 查用户是否已经授权 获得