别的不說。先導入AddressBook.framework先
然後引用 #import <AddressBook/AddressBook.h>
1、先授權,如果沒有授權提示到設定裡打開授權,如果已成功,讀取通訊錄資料到數組裡
addressBook = ABAddressBookCreate();
//注冊通訊錄更新回調
ABAddressBookRegisterExternalChangeCallback(addressBook, addressBookChanged, (__bridge void *)(self));
// iOS 6
-(bool)checkAddressBookAuthorizationStatus:(UITableView*)tableView;
{
//取得授權狀态
ABAuthorizationStatus authStatus =
ABAddressBookGetAuthorizationStatus();
if (authStatus != kABAuthorizationStatusAuthorized)
{
ABAddressBookRequestAccessWithCompletion
(addressBook, ^(bool granted, CFErrorRef error)
{
dispatch_async(dispatch_get_main_queue(), ^{
if (error)
NSLog(@"Error: %@", (__bridge NSError *)error);
else if (!granted) {
UIAlertView *av = [[UIAlertView alloc]
initWithTitle:@"Authorization Denied"
message:@"Set permissions in Settings>General>Privacy."
delegate:nil
cancelButtonTitle:nil
otherButtonTitles:@"OK", nil];
[av show];
}
else
{
//還原 ABAddressBookRef
ABAddressBookRevert(addressBook);
myContacts = [NSArray arrayWithArray:
(__bridge_transfer NSArray*)
ABAddressBookCopyArrayOfAllPeople(addressBook)];
[tableView reloadData];
}
});
});
}
return authStatus == kABAuthorizationStatusAuthorized;
}
2、如果通訊錄有更新,可能及時調用回調方法,請看上面第一段代碼 ABAddressBookRegisterExternalChangeCallback 方法
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
if (nil == myContacts)
{
addressBook = ABAddressBookCreate();
//注冊通訊錄更新回調
ABAddressBookRegisterExternalChangeCallback(addressBook, addressBookChanged, (__bridge void *)(self));
if ([self checkAddressBookAuthorizationStatus:tableView])
myContacts = [NSArray arrayWithArray:(__bridge_transfer NSArray*)
ABAddressBookCopyArrayOfAllPeople(addressBook)];
}
return 1;
}
void addressBookChanged(ABAddressBookRef addressBook, CFDictionaryRef info, void* context)
{
NSLog(@"Address Book Changed");
//__bridge arc顯式轉換。 與__unsafe_unretained 關鍵字一樣 隻是引用。被代入對象的所有者需要明确對象生命周期的管理,不要出現異常通路的問題
//__bridge_retained 類型被轉換時,其對象的所有權也将被變換後變量所持有
//__bridge_transfer 本來擁有對象所有權的變量,在類型轉換後,讓其釋放原先所有權 就相當于__bridge_retained後,原對像執行了release操作
RootViewController *viewController = objc_unretainedObject(context);
//更新通訊錄
[viewController updateAddressBook];
//登出通訊錄更新回調
// ABAddressBookUnregisterExternalChangeCallback(addressBook, addressBookChanged, context);
}
上面這段代碼主要功能是通訊錄有更新時。及時的重新整理資料
3、拿出數組中的聯系人資料
NSString *firstName = (__bridge_transfer NSString *)ABRecordCopyValue(person, kABPersonFirstNameProperty);
NSString *lastName = (__bridge_transfer NSString *)ABRecordCopyValue(person, kABPersonLastNameProperty);
//使用者頭像
NSData *d = (__bridge_transfer NSData*)ABPersonCopyImageData(objc_unretainedPointer([myContacts objectAtIndex:indexPath.row]));
//取電話資料
-(void)handleRowSelection:(int)rowIndex
{
ABRecordRef person = objc_unretainedPointer([myContacts objectAtIndex:rowIndex]);
ABMultiValueRef phoneNumbers = ABRecordCopyValue(person,
kABPersonPhoneProperty);
if (ABMultiValueGetCount(phoneNumbers) == 1)
[self callThisNumber:(__bridge_transfer NSString*)ABMultiValueCopyValueAtIndex(phoneNumbers, 0)];
else if (ABMultiValueGetCount(phoneNumbers) > 1)
{
UIAlertView *av = [[UIAlertView alloc] initWithTitle:@"Pick A Number"
message:@"Which number would you like to call?"
delegate:self
cancelButtonTitle:@"Cancel"
otherButtonTitles:nil];
for (int i=0; i < ABMultiValueGetCount(phoneNumbers); i++)
[av addButtonWithTitle:(__bridge_transfer NSString*)ABMultiValueCopyValueAtIndex(phoneNumbers, i)];
[av show];
}
if (phoneNumbers)
CFRelease(phoneNumbers);
}
4、删除通訊錄資料
<span style="white-space:pre"> </span>ABRecordRef person = objc_unretainedPointer([myContacts objectAtIndex:indexPath.row]);
CFErrorRef *error;
ABAddressBookRemoveRecord(addressBook, person, error);
ABAddressBookSave(addressBook, error);
myContacts = nil;
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
以上隻是我粗略的學習了一下相關的功能代碼片段