iOS有关通讯录操作
一、首先获取用户通讯录授权信息。
在AppDelegate中导入#import <AddressBook/AddressBook.h>框架,在下列方法中获取授权信息。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
具体代码:
1 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 2 3 // 1.获取通讯录授权状态 4 ABAuthorizationStatus status = ABAddressBookGetAuthorizationStatus(); 5 // 2.授权申请 6 if (status == kABAuthorizationStatusNotDetermined) { 7 // 有create就一定有release 8 ABAddressBookRef book = ABAddressBookCreateWithOptions(NULL, NULL); 9 10 ABAddressBookRequestAccessWithCompletion(book, ^(bool granted, CFErrorRef error) { 11 if (granted) { 12 NSLog(@"授权允许"); 13 }else { 14 NSLog(@"授权拒绝"); 15 } 16 }); 17 18 CFRelease(book); 19 } 20 return YES; 21 }
二、对通讯录联系人属性进行的一系列操作
1 - (void)viewDidLoad { 2 [super viewDidLoad]; 3 // 1.创建通讯录 4 ABAddressBookRef book = ABAddressBookCreate(); 5 // 2.得到所有通讯录 6 CFArrayRef results = ABAddressBookCopyArrayOfAllPeople(book); 7 8 for (NSUInteger i=0; i<CFArrayGetCount(results); i++) { 9 ABRecordRef person = CFArrayGetValueAtIndex(results, i); 10 11 // 读取firstName 12 NSString *personName = (__bridge NSString *)(ABRecordCopyValue(person, kABPersonFirstNameProperty)); 13 if (personName != nil) { 14 NSLog(@"名:%@", personName); 15 } 16 17 // 获取lastName 18 NSString *lastName = (__bridge NSString *)(ABRecordCopyValue(person, kABPersonLastNameProperty)); 19 if (lastName != nil) { 20 NSLog(@"姓:%@", lastName); 21 } 22 23 // NSString *lastNamePhonetic = (__bridge NSString *)(ABRecordCopyValue(book, kABPersonLastNamePhoneticProperty)); 24 // if (lastNamePhonetic != nil) { 25 // NSLog(@"%@", lastNamePhonetic); 26 // } 27 //读取organization公司 28 NSString *organization = (__bridge NSString*)ABRecordCopyValue(person, kABPersonOrganizationProperty); 29 if(organization != nil) NSLog(@"%@", organization); 30 31 32 //获取email多值 33 ABMultiValueRef email = ABRecordCopyValue(person, kABPersonEmailProperty); 34 int emailcount = ABMultiValueGetCount(email); 35 for (int x = 0; x < emailcount; x++) 36 { 37 //获取email Label 38 NSString* emailLabel = (__bridge NSString*)ABAddressBookCopyLocalizedLabel(ABMultiValueCopyLabelAtIndex(email, x)); 39 //获取email值 40 NSString* emailContent = (__bridge NSString*)ABMultiValueCopyValueAtIndex(email, x); 41 NSLog(@"emailLabel:%@,emailContent:%@",emailLabel,emailContent); 42 } 43 //读取地址多值 44 ABMultiValueRef address = ABRecordCopyValue(person, kABPersonAddressProperty); 45 int count = ABMultiValueGetCount(address); 46 47 for(int j = 0; j < count; j++) 48 { 49 //获取地址Label 50 NSString* addressLabel = (__bridge NSString*)ABMultiValueCopyLabelAtIndex(address, j); 51 NSLog(@"%@",addressLabel); 52 //获取該label下的地址6属性 53 NSDictionary* personaddress =(__bridge NSDictionary*) ABMultiValueCopyValueAtIndex(address, j); 54 NSString* country = [personaddress valueForKey:(NSString *)kABPersonAddressCountryKey]; 55 if(country != nil) 56 NSLog(@"国家:%@\n",country); 57 NSString* city = [personaddress valueForKey:(NSString *)kABPersonAddressCityKey]; 58 if(city != nil) 59 NSLog(@"城市:%@\n",city); 60 NSString* state = [personaddress valueForKey:(NSString *)kABPersonAddressStateKey]; 61 if(state != nil) 62 NSLog(@"省:%@\n",state); 63 NSString* street = [personaddress valueForKey:(NSString *)kABPersonAddressStreetKey]; 64 if(street != nil) 65 NSLog(@"街道:%@\n",street); 66 NSString* zip = [personaddress valueForKey:(NSString *)kABPersonAddressZIPKey]; 67 if(zip != nil) 68 NSLog(@"邮编:%@\n",zip); 69 NSString* coutntrycode = [personaddress valueForKey:(NSString *)kABPersonAddressCountryCodeKey]; 70 if(coutntrycode != nil) 71 NSLog(@"国家编号:%@\n",coutntrycode); 72 } 73 //第一次添加该条记录的时间 74 NSString *firstknow = (__bridge NSString*)ABRecordCopyValue(person, kABPersonCreationDateProperty); 75 NSLog(@"第一次添加该条记录的时间%@\n",firstknow); 76 //最后一次修改該条记录的时间 77 NSString *lastknow = (__bridge NSString*)ABRecordCopyValue(person, kABPersonModificationDateProperty); 78 NSLog(@"最后一次修改该条记录的时间%@\n",lastknow); 79 80 //读取电话多值 81 ABMultiValueRef phone = ABRecordCopyValue(person, kABPersonPhoneProperty); 82 for (int k = 0; k<ABMultiValueGetCount(phone); k++) 83 { 84 //获取电话Label 85 NSString * personPhoneLabel = (__bridge NSString*)ABAddressBookCopyLocalizedLabel(ABMultiValueCopyLabelAtIndex(phone, k)); 86 //获取該Label下的电话值 87 NSString * personPhone = (__bridge NSString*)ABMultiValueCopyValueAtIndex(phone, k); 88 89 NSLog(@"%@:%@\n",personPhoneLabel,personPhone); 90 } 91 92 //获取URL多值 93 ABMultiValueRef url = ABRecordCopyValue(person, kABPersonURLProperty); 94 for (int m = 0; m < ABMultiValueGetCount(url); m++) 95 { 96 //获取电话Label 97 NSString * urlLabel = (__bridge NSString*)ABAddressBookCopyLocalizedLabel(ABMultiValueCopyLabelAtIndex(url, m)); 98 //获取該Label下的电话值 99 NSString * urlContent = (__bridge NSString*)ABMultiValueCopyValueAtIndex(url,m); 100 101 NSLog(@"%@:%@\n",urlLabel,urlContent); 102 } 103 104 //读取照片 105 NSData *image = (__bridge NSData*)ABPersonCopyImageData(person); 106 107 108 UIImageView *myImage = [[UIImageView alloc] initWithFrame:CGRectMake(100, 200, 100, 100)]; 109 [myImage setImage:[UIImage imageWithData:image]]; 110 myImage.opaque = YES; 111 [self.view addSubview:myImage]; 112 113 } 114 115 CFRelease(book); 116 CFRelease(results); 117 }
这里只是获取了通讯录联系人的一部分属性。获取更多的属性参考《iOS 获取通讯录中联系人的所有属性》
三、获取这些属性你也可以利用三方框架RHAddressBook 参考: ios中访问通讯录数据
引入头文件,这里我用的是cocopods管理这个三方框架,引入框架同时 #import <RHAddressBook.h>,还要引入 #import <RHAddressBook/RHPerson.h>这个头文件。具体代码:
1 // 创建通讯录对象 2 RHAddressBook *book = [[RHAddressBook alloc] init]; 3 // 获取通讯录所有联系人 4 NSArray *peopleArray = book.people; 5 6 for (RHPerson *people in peopleArray) { 7 8 //获取人员的firstName 9 NSString* firstName = people.firstName; 10 //获取人员的lastName 11 NSString* lastName = people.lastName; 12 //获取该人员的号码(号码有多个,所以用RHMultiValue) 13 RHMultiValue* phoneNumbers = people.phoneNumbers; 14 NSUInteger phoneNumberCount = phoneNumbers.count; 15 for (int i = 0; i < phoneNumberCount; i++) { 16 //遍历每个号码中的label(比如:手机 家庭 公司) 17 NSString* label = [phoneNumbers labelAtIndex:i]; 18 //遍历出号码 19 NSString* nember = [phoneNumbers valueAtIndex:i]; 20 NSLog(@"%@, %@ ,%@,%@",firstName,lastName,label,nember); 21 } 22 NSLog(@"%@", people); 23 24 }
当然还有很多属性,具体可以进入文件查看其属性。
四、如果你对通讯录的添加删除感兴趣,可以参考
《iOS添加、删除通讯录》1 - (void)addAddressBook 2 { 3 // 创建一个通讯录操作对象 4 ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, NULL); 5 ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) { 6 if (granted) { 7 // 创建新的联系人记录 8 ABRecordRef newRecord = ABPersonCreate(); 9 NSString *firstName = @"五"; 10 NSString *lastName = @"王"; 11 // 为新的联系人添加属性值 12 ABRecordSetValue(newRecord, kABPersonFirstNameProperty, (__bridge CFTypeRef)(firstName), NULL); 13 ABRecordSetValue(newRecord, kABPersonLastNameProperty, (__bridge CFTypeRef)(lastName), NULL); 14 15 // 创建一个多值属性 16 ABMutableMultiValueRef multi = ABMultiValueCreateMutable(kABMultiStringPropertyType); 17 18 NSString *mobeileLabel = @"155"; 19 ABMultiValueAddValueAndLabel(multi, (__bridge CFTypeRef)(mobeileLabel), kABPersonPhoneMobileLabel, NULL); 20 21 // 将多值属性添加到记录 22 ABRecordSetValue(newRecord, kABPersonPhoneProperty, multi, NULL); 23 24 // 添加记录到通讯录操作对象 25 ABAddressBookAddRecord(addressBook, newRecord, NULL); 26 27 CFRelease(multi); 28 CFRelease(newRecord); 29 } 30 }); 31 ABAddressBookSave(addressBook, NULL); 32 CFRelease(addressBook); 33 }
五、推荐一篇值得学习的文章 iOS开发——高级篇——通讯录