iOS读取通讯录功能

别的不说。先导入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];


以上只是我粗略的学习了一下相关的功能代码片段



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值