文档章节

iOS技巧之获取本机通讯录中的内容,解析通讯录源代码

CEOIOS
 CEOIOS
发布于 2013/11/28 01:04
字数 794
阅读 1602
收藏 17

一、在工程中添加AddressBook.framework和AddressBookUI.framework

二、获取通讯录

1、在infterface中定义数组并在init方法中初始化

1 NSMutableArray *addressBookTemp;
2  
3 - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
4 {
5     addressBookTemp = [NSMutableArray array];
6 }
2、定义一个model,用来存放通讯录中的各个属性

新建一个继承自NSObject的类,在.h中

01 @interface TKAddressBook : NSObject {
02     NSInteger sectionNumber;
03     NSInteger recordID;
04     NSString *name;
05     NSString *email;
06     NSString *tel;
07 }
08 @property NSInteger sectionNumber;
09 @property NSInteger recordID;
10 @property (nonatomic, retain) NSString *name;
11 @property (nonatomic, retain) NSString *email;
12 @property (nonatomic, retain) NSString *tel;
13  
14 @end
在.m文件中进行synthesize
1 @implementation TKAddressBook
2 @synthesize name, email, tel, recordID, sectionNumber;
3  
4 @end

3、获取联系人

在iOS6之后,获取通讯录需要获得权限

01     //新建一个通讯录类
02     ABAddressBookRef addressBooks = nil;
03  
04     if ([[UIDevice currentDevice].systemVersion floatValue] >= 6.0)
05  
06     {
07         addressBooks =  ABAddressBookCreateWithOptions(NULL, NULL);
08  
09         //获取通讯录权限
10  
11         dispatch_semaphore_t sema = dispatch_semaphore_create(0);
12  
13         ABAddressBookRequestAccessWithCompletion(addressBooks, ^(bool granted, CFErrorRef error){dispatch_semaphore_signal(sema);});
14  
15         dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
16  
17         dispatch_release(sema);
18  
19     }
20  
21     else
22  
23     {
24         addressBooks = ABAddressBookCreate();
25  
26     }
27  
28 //获取通讯录中的所有人
29 CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople(addressBooks);
01 //通讯录中人数
02 CFIndex nPeople = ABAddressBookGetPersonCount(addressBooks);
03  
04 //循环,获取每个人的个人信息
05 for (NSInteger i = 0; i < nPeople; i++)
06     {
07         //新建一个addressBook model类
08         TKAddressBook *addressBook = [[TKAddressBook alloc] init];
09         //获取个人
10         ABRecordRef person = CFArrayGetValueAtIndex(allPeople, i);
11         //获取个人名字
12         CFTypeRef abName = ABRecordCopyValue(person, kABPersonFirstNameProperty);
13         CFTypeRef abLastName = ABRecordCopyValue(person, kABPersonLastNameProperty);
14         CFStringRef abFullName = ABRecordCopyCompositeName(person);
15         NSString *nameString = (__bridge NSString *)abName;
16         NSString *lastNameString = (__bridge NSString *)abLastName;
17          
18         if ((__bridge id)abFullName != nil) {
19             nameString = (__bridge NSString *)abFullName;
20         } else {
21             if ((__bridge id)abLastName != nil)
22             {
23                 nameString = [NSString stringWithFormat:@"%@ %@", nameString, lastNameString];
24             }
25         }
26         addressBook.name = nameString;
27         addressBook.recordID = (int)ABRecordGetRecordID(person);;
28          
29         ABPropertyID multiProperties[] = {
30             kABPersonPhoneProperty,
31             kABPersonEmailProperty
32         };
33         NSInteger multiPropertiesTotal = sizeof(multiProperties) / sizeof(ABPropertyID);
34         for (NSInteger j = 0; j < multiPropertiesTotal; j++) {
35             ABPropertyID property = multiProperties[j];
36             ABMultiValueRef valuesRef = ABRecordCopyValue(person, property);
37             NSInteger valuesCount = 0;
38             if (valuesRef != nil) valuesCount = ABMultiValueGetCount(valuesRef);
39              
40             if (valuesCount == 0) {
41                 CFRelease(valuesRef);
42                 continue;
43             }
44             //获取电话号码和email
45             for (NSInteger k = 0; k < valuesCount; k++) {
46                 CFTypeRef value = ABMultiValueCopyValueAtIndex(valuesRef, k);
47                 switch (j) {
48                     case 0: {// Phone number
49                         addressBook.tel = (__bridge NSString*)value;
50                         break;
51                     }
52                     case 1: {// Email
53                         addressBook.email = (__bridge NSString*)value;
54                         break;
55                     }
56                 }
57                 CFRelease(value);
58             }
59             CFRelease(valuesRef);
60         }
61         //将个人信息添加到数组中,循环完成后addressBookTemp中包含所有联系人的信息
62         [addressBookTemp addObject:addressBook];
63          
64         if (abName) CFRelease(abName);
65         if (abLastName) CFRelease(abLastName);
66         if (abFullName) CFRelease(abFullName);
67     }
三、显示在table中
1 //行数
2 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
3     return 1;
4 }
5  
6 //列数
7 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
8     return [addressBookTemp count];
9 }
01 //cell内容
02 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
03      
04     NSString *cellIdentifier = @"ContactCell";
05      
06     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
07      
08     if (cell == nil){
09         cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellIdentifier];
10     }
11  
12     TKAddressBook *book = [addressBookTemp objectAtIndex:indexPath.row];
13  
14     cell.textLabel.text = book.name;
15  
16     cell.detailTextLabel.text = book.tel;
17  
18     return cell;
19 }
列表效果

PS:通讯录中电话号码中的"-"可以在存入数组之前进行处理,属于NSString处理的范畴,解决办法有很多种,本文不多加说明

© 著作权归作者所有

CEOIOS
粉丝 8
博文 42
码字总数 24961
作品 0
深圳
程序员
私信 提问
加载中

评论(1)

奥西里斯
奥西里斯
问一下楼主,我现在target 是ios7,并且arc打开,dispatch_release报错,这句话是不需要了么,还是有别的写法?
ios通讯录自动生成

ios通讯录自动生成 详细需求: 首先要自动生成通讯录号码段13800000000-13899999999到号码库,以便随机抽取 号码长度请不要限定,因为有时候要用到国际码.比如0086013800000000-008601389999...

sky2018
2016/07/01
13
0
iOS开发之AddressBookUI框架详解

iOS开发之AddressBookUI框架详解 一、关于AddressBookUI框架 AddressbookUI是iOS开发框架中提供的一套通讯录界面组件。其中封装好了一套选择联系人,查看联系人的界面,在需要时开发者可以直...

珲少
2018/08/23
70
0
2015-4-3 (星期五)周会,讨论主题:团队思考:我们是不是需要有自己的、独立的团队精神?

后台:接口开发和数据库调整,主要是好友关系,通讯录 UI:通讯录的图片化 安卓开发:计划采用开源的交互模块来构建客户端,可以节约开发时间,提高安卓客户端交互性能,但 风险是与IOS的风格...

CapJes
2015/04/03
10
0
IOS项目开发

【业务需求】 IOS客户端的即时通讯模块开发,聊天需对接第三方平台(如个推、极光推送),含通讯录管理、即时聊天,聊天记录;个人动态发布,类似于微信、QQ的动态; 【人员要求】 1. 3年以上...

roy_he
2016/03/27
11
11
iOS开发之AddressBook框架详解

iOS开发之AddressBook框架详解 一、写在前面 首先,AddressBook框架是一个已经过时的框架,iOS9之后官方提供了Contacts框架来进行用户通讯录相关操作。尽管如此,AddressBook框架依然是一个非...

珲少
2018/08/19
119
0

没有更多内容

加载失败,请刷新页面

加载更多

总结:TCP/IP协议

一、介绍 TCP协议属于OSI七层模型中的传输层协议,提供处于网络连接中的两台计算机之间的数据 传输。   在传输层有两个性质不同的协议:TCP(Transmission Control Protocol,传输控制协议...

浮躁的码农
4分钟前
1
0
一言不合就删库跑路?万名贡献者和阿里巴巴开源的二三事

9 月 27 日云栖大会,阿里巴巴宣布贾扬清担任开源技术委员会负责人。 有人问:开源是为了什么? 从个人视角看,可以证明自己的专业能力,获得行业认可; 从企业视角看,可以建立技术影响力,...

大涛学弟
14分钟前
2
0
JAVA编程注意事项(性能篇)

1. 尽量在合适的场合使用单例 使用单例可以缩短加载的时间,提高加载的效率,单例主要适用于以下三个方面: 第一,控制资源的使用,通过线程同步来控制资源的并发访问; 第二,控制实例的产生...

你好夜故事
16分钟前
2
0
List 前端 AngularJS JS 对IP排序

数据格式 $scope.dataList=[ {"ip":"192.168.10.10", "port":"8080",...}, { "ip":"192.168.10.12", "port":"8080",... } ,.....] 调用 $scope.ipSortForward($scope.dataList,"ip") 核心代码......

最菜最菜之小菜鸟
16分钟前
2
0
浅析Cassandra LeveledCompactionStrategy

前言 Cassandra是基于LSM架构的分布式数据库。LSM中有一个很重要的过程,就是压缩(Compaction)。默认的压缩策略是SizeTieredCompactionStrategy,今天主要说一下另一种压缩策略LeveledComp...

阿里云官方博客
20分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部