1.设置 info.plist 的Privacy - Contacts Usage Description
"本app名字"想访问您的通讯录
2.导入头文件
#import <Contacts/Contacts.h>
3.通过代码获取
//请求通讯录权限 #pragma mark 请求通讯录权限 - (void)requestContactAuthorAfterSystemVersion9{ CNAuthorizationStatus status = [CNContactStore authorizationStatusForEntityType:CNEntityTypeContacts]; if (status == CNAuthorizationStatusNotDetermined) { CNContactStore *store = [[CNContactStore alloc] init]; [store requestAccessForEntityType:CNEntityTypeContacts completionHandler:^(BOOL granted, NSError* _Nullable error) { if (error) { NSLog(@"授权失败"); }else { NSLog(@"成功授权"); } }]; } else if(status == CNAuthorizationStatusRestricted) { NSLog(@"用户拒绝"); [self showAlertViewAboutNotAuthorAccessContact]; } else if (status == CNAuthorizationStatusDenied) { NSLog(@"用户拒绝"); [self showAlertViewAboutNotAuthorAccessContact]; } else if (status == CNAuthorizationStatusAuthorized)//已经授权 { //有通讯录权限-- 进行下一步操作 [self openContact]; } } //有通讯录权限-- 进行下一步操作 - (void)openContact{ // 获取指定的字段,并不是要获取所有字段,需要指定具体的字段 NSArray *keysToFetch = @[CNContactGivenNameKey, CNContactFamilyNameKey, CNContactPhoneNumbersKey]; CNContactFetchRequest *fetchRequest = [[CNContactFetchRequest alloc] initWithKeysToFetch:keysToFetch]; CNContactStore *contactStore = [[CNContactStore alloc] init]; [contactStore enumerateContactsWithFetchRequest:fetchRequest error:nil usingBlock:^(CNContact * _Nonnull contact, BOOL * _Nonnull stop) { NSLog(@"-------------------------------------------------------"); NSString *givenName = contact.givenName; NSString *familyName = contact.familyName; NSLog(@"givenName=%@, familyName=%@", givenName, familyName); //拼接姓名 NSString *nameStr = [NSString stringWithFormat:@"%@%@",contact.familyName,contact.givenName]; NSArray *phoneNumbers = contact.phoneNumbers; for (CNLabeledValue *labelValue in phoneNumbers) { //遍历一个人名下的多个电话号码 NSString *label = labelValue.label; CNPhoneNumber *phoneNumber = labelValue.value; NSString * string = phoneNumber.stringValue ; //去掉电话中的特殊字符 string = [string stringByReplacingOccurrencesOfString:@"+86" withString:@""]; string = [string stringByReplacingOccurrencesOfString:@"-" withString:@""]; string = [string stringByReplacingOccurrencesOfString:@"(" withString:@""]; string = [string stringByReplacingOccurrencesOfString:@")" withString:@""]; string = [string stringByReplacingOccurrencesOfString:@" " withString:@""]; string = [string stringByReplacingOccurrencesOfString:@" " withString:@""]; NSLog(@"姓名=%@, 电话号码是=%@", nameStr, string); } }]; } //提示没有通讯录权限 - (void)showAlertViewAboutNotAuthorAccessContact{ UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"请授权通讯录权限" message:@"请在iPhone的\"设置-隐私-通讯录\"选项中,允许花解解访问你的通讯录" preferredStyle: UIAlertControllerStyleAlert]; UIAlertAction *OKAction = [UIAlertAction actionWithTitle:@"好的" style:UIAlertActionStyleDefault handler:nil]; [alertController addAction:OKAction]; [self presentViewController:alertController animated:YES completion:nil]; }
4.如果需要排序上传首字母,需要将name转拼音,然后获取首字母
//汉字转拼音 - (NSString *)pinyin{ NSMutableString *str = [self mutableCopy]; //带音标 CFStringTransform(( CFMutableStringRef)str, NULL, kCFStringTransformMandarinLatin, NO); //不带音标 CFStringTransform((CFMutableStringRef)str, NULL, kCFStringTransformStripDiacritics, NO); return [str stringByReplacingOccurrencesOfString:@" " withString:@""]; }