ios-read-userContacts

读取用户通讯录的联系人信息

最近项目中用到上传用户通讯录的功能,做的过程中也遇到了一些问题,包括授权、中英文首字母排序、中英文输入字母搜索匹配等。
这里读取包括读取联系人的邮箱、公司、职位、备注、家乡。

中英文排序和搜索如何实现,我写了一个demo放在了github上

1.iOS6之后读取用户通讯录是必须经过用户授权的,只会授权一次,不管你是允许还是不允许,以后想要在更改用户通讯录的权限,都只能在系统设置里修改。

2.做的过程中还发现其实如果你的读取通讯录的功能做在app内部的网页里,是可以不经用户授权直接跨过系统权限读取,也是可以成功的,H5页面跟app客户端进行交互,调用Native code(网页跟客户端的交互,如果有时间也是想单独总结出一篇,总之就是精力不够啊😂)

前面好像讲了一堆废话,好吧,还是直接上代码吧。

self.dataArrayDic = [NSMutableArray arrayWithCapacity:0];
ABAddressBookRef addressBook ;

addressBook = ABAddressBookCreateWithOptions(NULL, NULL);
dispatch_semaphore_t sema = dispatch_semaphore_create(0);
ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error)                                                     {
    dispatch_semaphore_signal(sema);
});
dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
//取得本地所有联系人记录
CFArrayRef results = ABAddressBookCopyArrayOfAllPeople(addressBook);
for(int i = 0; i < CFArrayGetCount(results); i++)
{
    NSMutableDictionary *dicInfoLocal = [NSMutableDictionary dictionaryWithCapacity:0];
    ABRecordRef person = CFArrayGetValueAtIndex(results, i);
    ABMultiValueRef tmlphone =  ABRecordCopyValue(person, kABPersonPhoneProperty);
    NSArray *telphone = (__bridge NSArray*)ABMultiValueCopyArrayOfAllValues(tmlphone);
    if (telphone == nil) {
        telphone = @[];
    }
    [dicInfoLocal setObject:telphone forKey:@"telephone"];
    CFRelease(tmlphone);

    NSString *last = (__bridge NSString *)ABRecordCopyValue(person, kABPersonLastNameProperty);
    if (last == nil) {
        last = @" ";
    }
    [dicInfoLocal setObject:last forKey:@"last"];

    //读取firstname
    NSString *first = (__bridge NSString*)ABRecordCopyValue(person, kABPersonFirstNameProperty);
    if (first == nil || [first isEqualToString:@""]) {
        first = @" ";
    }
    if ([first isEqualToString:@" "] && [last isEqualToString:@" "] ) {
        if (telphone.count > 0) {
            first = telphone[0];
        }
    }
    [dicInfoLocal setObject:first forKey:@"first"];

    NSString *nickname = (__bridge NSString *)ABRecordCopyValue(person, kABPersonNicknameProperty);
    if (nickname == nil) {
        nickname = @"";
    }
    NSMutableDictionary *extra = [NSMutableDictionary dictionary];
    [extra setObject:nickname forKey:@"nickname"];

    NSString *middlename = (__bridge NSString *)ABRecordCopyValue(person, kABPersonMiddleNamePhoneticProperty);
    if (middlename == nil) {
        middlename = @"";
    }
    [extra setObject:middlename forKey:@"middlename"];

    NSString *organization = (__bridge NSString *)ABRecordCopyValue(person, kABPersonOrganizationProperty);
    if (organization == nil) {
        organization = @"";
    }
    [extra setObject:organization forKey:@"organization"];

    NSString *jobTitle = (__bridge NSString *)ABRecordCopyValue(person, kABPersonJobTitleProperty);
    if (jobTitle == nil) {
        jobTitle = @"";
    }
    [extra setObject:jobTitle forKey:@"jobTitle"];

    [dicInfoLocal setObject:extra forKey:@"extra"];

    NSString *department = (__bridge NSString *)ABRecordCopyValue(person, kABPersonDepartmentProperty);
    if (department == nil) {
        department = @"";
    }
    [extra setObject:department forKey:@"department"];

    ABMultiValueRef emailTmp =  ABRecordCopyValue(person, kABPersonEmailProperty);
    NSArray *emails = (__bridge NSArray*)ABMultiValueCopyArrayOfAllValues(emailTmp);
    if (emails == nil) {
        emails = @[];
    }
    CFRelease(emailTmp);

    [extra setObject:emails forKey:@"email"];

    NSString *birthday = (__bridge NSString *)ABRecordCopyValue(person, kABPersonBirthdayProperty);
    if (birthday == nil) {
        birthday = @"";
    }
    [extra setObject:birthday forKey:@"birthday"];

    NSString *note = (__bridge NSString *)ABRecordCopyValue(person, kABPersonNoteProperty);
    if (note == nil) {
        note = @"";
    }
    [extra setObject:note forKey:@"note"];

    NSString *personCreationDate = (__bridge NSString *)ABRecordCopyValue(person, kABPersonCreationDateProperty);
    if (personCreationDate == nil) {
        personCreationDate = @"";
    }
    [extra setObject:personCreationDate forKey:@"personCreationDate"];

    NSString *personModifyDate = (__bridge NSString *)ABRecordCopyValue(person, kABPersonModificationDateProperty);
    if (personModifyDate == nil) {
        personModifyDate = @"";
    }
    [extra setObject:personModifyDate forKey:@"personModifyDate"];

    ABMultiValueRef streetTmp =  ABRecordCopyValue(person, kABPersonAddressProperty);
    NSArray *street = (__bridge NSArray*)ABMultiValueCopyArrayOfAllValues(streetTmp);
    if (street == nil) {
        street = @[];
    }
    CFRelease(streetTmp);

    [extra setObject:street forKey:@"street"];

    if ([first isEqualToString:@" "] == NO || [last isEqualToString:@" "] || (telphone.count > 0)) {
        [self.dataArrayDic addObject:dicInfoLocal];
    }
}
CFRelease(results);//new
CFRelease(addressBook);//new

希望帮到你,Best wishes!