iOS通讯录开发框架的学习和使用(一)

iOS9之前有两个通讯录相关的框架,AddressBookUI.framework 和 AddressBook.framework。前者包含UI界面,后者无UI界面(如微信电话本),可以自己搭建UI界面。后者是纯C语言的API,仅仅是获得联系人数据,里面的数据大部分是基于Core Foundation框架,使用起来异常麻烦。注意:需要授权才能访问通讯录。iOS9之后出现一个ContactsUI框架,这个框架相比前两者使用起来要方便很多。虽然如此,但是这个从这个框架的名字中可以看出是带有UI界面的,但是很多时候我们可能要自定义,所以除了这个框架,iOS9之前的框架也是很有必要学习的。
先看一下AddressBookUI框架。使用这个框架要导入头文件<ABPeoplePickerNavigationControllerDelegate>,并且要遵守这个协议。

//1.创建联系人选择控制器
    ABPeoplePickerNavigationController *picker = [ABPeoplePickerNavigationController new];
    //2.设置代理  注意不是delegate  
    picker.peoplePickerDelegate = self;
    //3.模态视图弹出
    [self presentViewController:picker animated:YES completion:nil];

下面的是对应的一个代理方法,当选中联系人的时候会调用该方法。

- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker didSelectPerson:(ABRecordRef)person{
    //需求:获取姓名和电话
    //1.获取姓和名
    //一个Record就相当于一条记录
    //姓
    CFStringRef lastName = ABRecordCopyValue(person, kABPersonLastNameProperty);
    NSString *lastNameStr = (__bridge NSString *)(lastName);//桥接
    NSLog(@"lastName=%@",lastNameStr);
    //名
    CFStringRef firstName = ABRecordCopyValue(person, kABPersonFirstNameProperty);
    NSString *firstNameStr = (__bridge NSString *)(firstName);//桥接
    NSLog(@"firstName=%@",firstNameStr);
    //CF对象一定要释放
    CFRelease(lastName);
    CFRelease(firstName);
    
    //2.获取电话   注意可能有多个电话
    ABMultiValueRef phones = ABRecordCopyValue(person, kABPersonPhoneProperty);
    //2.1 获取电话个数  phones.count不可以获取个数
    CFIndex count = ABMultiValueGetCount(phones);
    //2.2 遍历联系人
    for (CFIndex i = 0 ; i < count; i++) {
        //2.3 获取联系电话的标签
        //两种写法
        NSString *label = (__bridge_transfer NSString *)ABMultiValueCopyLabelAtIndex(phones, i);
        //NSString *label = CFBridgingRelease(ABMultiValueCopyLabelAtIndex(phones, i));
        NSLog(@"电话标签:%@",label);//_$!<Home>!$_
        
        //2.4 获取联系人电话
        NSString *value =(__bridge_transfer NSString *)ABMultiValueCopyValueAtIndex(phones, i);
        NSLog(@"电话号码:%@",value);
    }
    //3.释放CF对象
    CFRelease(phones)
}

//选中某个联系人的某个属性时候调用
- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker didSelectPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier{
    NSLog(@"%d",property);
}
//取消选中联系人调用
- (void)peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)peoplePicker{
   
}

关于上面的三个代理方法要稍微说明一下。第一个代理方法,在iOS7下必须能实现此方法,否则会崩溃,在选中摸个联系人的时候会调用此方法。前两个代理方法,如果同时实现只会执行第一个方法。一般情况下只要求执行下面两个方法中的一个即可,如果实现第二个会进入联系人详情界面。

关于iOS7和iOS8的适配问题:
1.在iOS7下必须能实现以下第一个方法,否则会崩溃
2.iOS7可以同时实现两个代理方法,而iOS8只能实现一个(同时实现只会执行第一个方法)
3.iOS7选择联系人代理方法,如果返回YES则会跳到下一个界面,如果返回NO,必须手动实现取消控制器的方法。iOS8默认会在点击联系人的时候,自动取消显示控制器。
注意:如果想适配iOS7和iOS,代理方法必须都写,这样才可以适配7和8

上面涉及这么多和Core Foundation相关的东西,这里就稍微做一些额外的补充。
1. Core Foundation 和 Foundation桥接的问题,桥接有几种方法?
共三种方法,具体如下:
a、CFStringRef lastName = ABRecordCopyValue(person, kABPersonLastNameProperty);
NSString *lastNameStr = (__bridge NSString *)(lastName);
CFRelease(lastName);
b、以下两种写法形式,意思一样。
NSString *label = (__bridge_transfer NSString *)ABMultiValueCopyLabelAtIndex(phones, i);
NSString *label = CFBridgingRelease(ABMultiValueCopyLabelAtIndex(phones, i));
c、
// (__bridge <#type#>)<#expression#>) 只是让Foundation框架暂时使用CF框架对象,一般都要释放CF对象
//(__bridge_transfer <#Objective-C type#>)<#expression#>) CF框架移交管理权给Foundation框架
//(__bridge_retained <#CF type#>)<#expression#>) 前面两个是将CF对象转为Foundation对象,而这个是将Foundation对象转为CF对象,一般不常用
2.注意事项:
CF对象一定要释放,否则出现内存泄露。CFRelease(lastName);

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容

  • 躺在虚浮的空间里 微风透过窗户 在忧沉的屋子里留下斑驳 留下印记 翻过身蹭到你身边 你拉我入怀 环抱着我 滚烫的温...
    查理谢谢阅读 100评论 1 1
  • 北方下了初雪, 气温降了几度, 又焐热了几双手。 南方窗飘雨滴, 湿哒哒成一片, 我家门口积了水。 在校道上放肆大...
    257杂记阅读 144评论 0 0
  • #58号雕刻打卡Day95# 1.九点靠墙站10分钟 2.肩背部打开100个 3.脊椎拉伸5组 4. 膝盖夹名片1...
    一然2016阅读 160评论 0 1