读取用户通讯录的联系人信息
最近项目中用到上传用户通讯录的功能,做的过程中也遇到了一些问题,包括授权、中英文首字母排序、中英文输入字母搜索匹配等。
这里读取包括读取联系人的邮箱、公司、职位、备注、家乡。
中英文排序和搜索如何实现,我写了一个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!