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

一、在工程中添加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 }
列表效果

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

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

你可能感兴趣的:(获取本机通讯录)