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