ABAddressBookRef

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、删除通讯录数据

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];


}

你可能感兴趣的:(ABAddressBookRef)