iOS获取通讯录功能

先导入AddressBook.framework先

然后引用  #import <AddressBook/AddressBook.h>

1、先授权,如果没有授权提示到设置里打开授权,如果已成功,读取通讯录数据到数组里

[objc]  view plain  copy
 
  1. addressBook = ABAddressBookCreate();  
  2.          
  3.        //注册通讯录更新回调  
  4.        ABAddressBookRegisterExternalChangeCallback(addressBook, addressBookChanged, (__bridge voidvoid *)(self));  

[objc]  view plain  copy
 
  1. // iOS 6  
  2. -(bool)checkAddressBookAuthorizationStatus:(UITableView*)tableView;  
  3. {  
  4.     //取得授权状态  
  5.     ABAuthorizationStatus authStatus =  
  6.         ABAddressBookGetAuthorizationStatus();  
  7.   
  8.     if (authStatus != kABAuthorizationStatusAuthorized)  
  9.     {  
  10.         ABAddressBookRequestAccessWithCompletion  
  11.             (addressBook, ^(bool granted, CFErrorRef error)  
  12.         {  
  13.             dispatch_async(dispatch_get_main_queue(), ^{  
  14.                 if (error)  
  15.                     NSLog(@"Error: %@", (__bridge NSError *)error);  
  16.                 else if (!granted) {  
  17.                     UIAlertView *av = [[UIAlertView alloc]  
  18.                        initWithTitle:@"Authorization Denied"  
  19.                        message:@"Set permissions in Settings>General>Privacy."  
  20.                        delegate:nil  
  21.                        cancelButtonTitle:nil  
  22.                        otherButtonTitles:@"OK", nil nil];  
  23.                     [av show];  
  24.                 }  
  25.                 else  
  26.                 {  
  27.                     //还原 ABAddressBookRef  
  28.                     ABAddressBookRevert(addressBook);  
  29.                     myContacts = [NSArray arrayWithArray:  
  30.                           (__bridge_transfer NSArray*)  
  31.                           ABAddressBookCopyArrayOfAllPeople(addressBook)];  
  32.                     [tableView reloadData];  
  33.                 }  
  34.             });  
  35.         });  
  36.     }  
  37.       
  38.     return authStatus == kABAuthorizationStatusAuthorized;  
  39. }  

2、如果通讯录有更新,可能及时调用回调方法,请看上面第一段代码 ABAddressBookRegisterExternalChangeCallback 方法

[objc]  view plain  copy
 
  1. - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {  
  2.     if (nil == myContacts)  
  3.     {  
  4.         addressBook = ABAddressBookCreate();  
  5.           
  6.         //注册通讯录更新回调  
  7.         ABAddressBookRegisterExternalChangeCallback(addressBook, addressBookChanged, (__bridge voidvoid *)(self));  
  8.           
  9.         if ([self checkAddressBookAuthorizationStatus:tableView])  
  10.             myContacts = [NSArray arrayWithArray:(__bridge_transfer NSArray*)  
  11.                           ABAddressBookCopyArrayOfAllPeople(addressBook)];  
  12.     }  
  13.     return 1;  
  14. }  
  15.   
  16. void addressBookChanged(ABAddressBookRef addressBook, CFDictionaryRef info, void* context)  
  17. {  
  18.     NSLog(@"Address Book Changed");  
  19.     //__bridge               arc显式转换。 与__unsafe_unretained 关键字一样 只是引用。被代入对象的所有者需要明确对象生命周期的管理,不要出现异常访问的问题  
  20.     //__bridge_retained      类型被转换时,其对象的所有权也将被变换后变量所持有  
  21.     //__bridge_transfer      本来拥有对象所有权的变量,在类型转换后,让其释放原先所有权 就相当于__bridge_retained后,原对像执行了release操作  
  22.     RootViewController *viewController = objc_unretainedObject(context);  
  23.     //更新通讯录  
  24.     [viewController updateAddressBook];  
  25.       
  26.     //注销通讯录更新回调  
  27. //    ABAddressBookUnregisterExternalChangeCallback(addressBook, addressBookChanged, context);  
  28. }  

上面这段代码主要功能是通讯录有更新时。及时的刷新数据


3、拿出数组中的联系人数据

[objc]  view plain  copy
 
  1. NSString *firstName = (__bridge_transfer NSString *)ABRecordCopyValue(person, kABPersonFirstNameProperty);  
  2. NSString *lastName = (__bridge_transfer NSString *)ABRecordCopyValue(person, kABPersonLastNameProperty);  
  3. //用户头像  
  4. NSData *d = (__bridge_transfer NSData*)ABPersonCopyImageData(objc_unretainedPointer([myContacts objectAtIndex:indexPath.row]));  
  5. //取电话数据  
  6. -(void)handleRowSelection:(int)rowIndex  
  7. {  
  8.     ABRecordRef person = objc_unretainedPointer([myContacts objectAtIndex:rowIndex]);  
  9.     ABMultiValueRef phoneNumbers = ABRecordCopyValue(person,  
  10.                                                      kABPersonPhoneProperty);  
  11.   
  12.     if (ABMultiValueGetCount(phoneNumbers) == 1)  
  13.         [self callThisNumber:(__bridge_transfer NSString*)ABMultiValueCopyValueAtIndex(phoneNumbers, 0)];  
  14.     else if (ABMultiValueGetCount(phoneNumbers) > 1)  
  15.     {  
  16.         UIAlertView *av = [[UIAlertView alloc] initWithTitle:@"Pick A Number"   
  17.                                                       message:@"Which number would you like to call?"   
  18.                                                      delegate:self   
  19.                                             cancelButtonTitle:@"Cancel"   
  20.                                             otherButtonTitles:nil];  
  21.   
  22.         for (int i=0; i < ABMultiValueGetCount(phoneNumbers); i++)  
  23.             [av addButtonWithTitle:(__bridge_transfer NSString*)ABMultiValueCopyValueAtIndex(phoneNumbers, i)];  
  24.   
  25.         [av show];  
  26.     }  
  27.       
  28.     if (phoneNumbers)  
  29.         CFRelease(phoneNumbers);      
  30. }  


4、删除通讯录数据

[objc]  view plain  copy
 
  1. <span style="white-space:pre">    </span>ABRecordRef person = objc_unretainedPointer([myContacts objectAtIndex:indexPath.row]);  
  2.         CFErrorRef *error;  
  3.         ABAddressBookRemoveRecord(addressBook, person, error);  
  4.         ABAddressBookSave(addressBook, error);  
  5.         myContacts = nil;  
  6.         [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];  

你可能感兴趣的:(iOS获取通讯录功能)