iOS开发获取手机通讯录中的电话号码和姓名

本文介绍如何在iOS应用中正确申请通讯录权限,并提供详细的代码示例说明如何检查授权状态、请求授权及获取通讯录信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、申请授权

  1. <span style=“font-size:14px;”>#import “AppDelegate.h”  
  2. #import <AddressBook/AddressBook.h>  
  3.   
  4. @interface AppDelegate ()  
  5.   
  6. @end  
  7.   
  8. @implementation AppDelegate  
  9.   
  10. - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {  
  11.     // Override point for customization after application launch.  
  12.   
  13.     [self requestAuthorizationAddressBook];  
  14.     return YES;  
  15. }  
  16.   
  17.   
  18. - (void)requestAuthorizationAddressBook {  
  19.     // 判断是否授权  
  20.     ABAuthorizationStatus authorizationStatus = ABAddressBookGetAuthorizationStatus();  
  21.     if (authorizationStatus == kABAuthorizationStatusNotDetermined) {  
  22.         // 请求授权  
  23.         ABAddressBookRef addressBookRef =  ABAddressBookCreate();  
  24.         ABAddressBookRequestAccessWithCompletion(addressBookRef, ^(bool granted, CFErrorRef error) {  
  25.             if (granted) {  // 授权成功  
  26.   
  27.             } else {        // 授权失败  
  28.                 NSLog(@”授权失败!”);  
  29.             }  
  30.         });  
  31.     }  
  32. }  
  33. @end</span>  
#import "AppDelegate.h"




#import <AddressBook/AddressBook.h> @interface AppDelegate () @end @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. [self requestAuthorizationAddressBook]; return YES; } - (void)requestAuthorizationAddressBook { // 判断是否授权 ABAuthorizationStatus authorizationStatus = ABAddressBookGetAuthorizationStatus(); if (authorizationStatus == kABAuthorizationStatusNotDetermined) { // 请求授权 ABAddressBookRef addressBookRef = ABAddressBookCreate(); ABAddressBookRequestAccessWithCompletion(addressBookRef, ^(bool granted, CFErrorRef error) { if (granted) { // 授权成功 } else { // 授权失败 NSLog(@"授权失败!"); } }); } } @end

2、iOS10之后需要在Info.plist中配置NSContactsUsageDescription

  1. <key>NSContactsUsageDescription</key>  
  2. <string>请求访问通讯录</string>   
<key>NSContactsUsageDescription</key>
<string>请求访问通讯录</string> 


3、请求访问并获取通讯录

3.1、导入头文件

#import <AddressBook/AddressBook.h>

3.2、访问并获取

  1. - (void)getAddressBookClick{  
  2.       
  3.     ABAddressBookRef addressBook = ABAddressBookCreate();  
  4.     //用户授权  
  5.     if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusNotDetermined) {//首次访问通讯录  
  6.         ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) {  
  7.             if (!error) {  
  8.                 if (granted) {//允许  
  9.                     NSArray *contacts = [self fetchContactWithAddressBook:addressBook];  
  10.                     dispatch_async(dispatch_get_main_queue(), ^{  
  11.                         NSLog(@”\n contacts:%@”, contacts);  
  12.                     });  
  13.                 }else{//拒绝  
  14.                     NSLog(@”拒绝”);  
  15.                 }  
  16.             }else{  
  17.                 NSLog(@”错误!”);  
  18.             }  
  19.         });  
  20.     }else{//非首次访问通讯录  
  21.          
  22.         NSArray *contacts = [self fetchContactWithAddressBook:addressBook];  
  23.         dispatch_async(dispatch_get_main_queue(), ^{  
  24.             NSLog(@”\n contacts:%@”, contacts);  
  25.         });  
  26.     }  
  27. }  
  28.   
  29. - (NSMutableArray *)fetchContactWithAddressBook:(ABAddressBookRef)addressBook{  
  30.     if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusAuthorized) {有权限访问  
  31.         //获取联系人数组  
  32.         NSArray *array = (__bridge NSArray *)ABAddressBookCopyArrayOfAllPeople(addressBook);  
  33.         NSMutableArray *contacts = [NSMutableArray array];  
  34.         for (int i = 0; i < array.count; i++) {  
  35.             //获取联系人  
  36.             ABRecordRef people = CFArrayGetValueAtIndex((__bridge ABRecordRef)array, i);  
  37.             //获取联系人详细信息,如:姓名,电话,住址等信息  
  38.             NSString *firstName = (__bridge NSString *)ABRecordCopyValue(people, kABPersonFirstNameProperty);  
  39.             NSString *lastName = (__bridge NSString *)ABRecordCopyValue(people, kABPersonLastNameProperty);  
  40.           
  41.             //判断姓名null  
  42.             NSString *allName;  
  43.             if ([CommandHelp checkStringIsNull:lastName] && [CommandHelp checkStringIsNull:firstName]) {  
  44.                 allName = [NSString stringWithFormat:@”%@%@”,lastName,firstName];  
  45.             }else if([CommandHelp checkStringIsNull:firstName]){  
  46.                 allName = firstName;  
  47.             }else if ([CommandHelp checkStringIsNull:lastName]){  
  48.                 allName = lastName;  
  49.             }else{  
  50.                 allName = @”“;  
  51.             }  
  52.               
  53.             ABMutableMultiValueRef phoneNumRef = ABRecordCopyValue(people, kABPersonPhoneProperty);  
  54.             NSString *phoneNumber =  ((__bridge NSArray *)ABMultiValueCopyArrayOfAllValues(phoneNumRef)).lastObject;  
  55.             //判断手机号null  
  56.             NSString *phone;  
  57.             if ([CommandHelp checkStringIsNull:phoneNumber]) {  
  58.                 phone = phoneNumber;  
  59.             }else{  
  60.                 phone = @”“;  
  61.             }  
  62.               
  63.             //如果不加上面的判断,这里加入数组的时候会出错,不会判断(null)这个东西,所以要先排除  
  64.             [contacts addObject:@{@”name”: allName, @”phoneNumber”: phone}];  
  65.            
  66.         }  
  67.         return contacts;  
  68.     }else{//无权限访问  
  69.         //提示授权  
  70.         UIAlertView * alart = [[UIAlertView alloc]initWithTitle:@”温馨提示” message:@”请您设置允许APP访问您的通讯录\n设置-隐私-通讯录” delegate:self cancelButtonTitle:@”确定” otherButtonTitles:nil, nil nil];  
  71.         [alart show];  
  72.         return nil;  
  73.     }  
  74. }  
- (void)getAddressBookClick{

    ABAddressBookRef addressBook = ABAddressBookCreate();
    //用户授权
    if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusNotDetermined) {//首次访问通讯录
        ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) {
            if (!error) {
                if (granted) {//允许
                    NSArray *contacts = [self fetchContactWithAddressBook:addressBook];
                    dispatch_async(dispatch_get_main_queue(), ^{
                        NSLog(@"\n contacts:%@", contacts);
                    });
                }else{//拒绝
                    NSLog(@"拒绝");
                }
            }else{
                NSLog(@"错误!");
            }
        });
    }else{//非首次访问通讯录

        NSArray *contacts = [self fetchContactWithAddressBook:addressBook];
        dispatch_async(dispatch_get_main_queue(), ^{
            NSLog(@"\n contacts:%@", contacts);
        });
    }
}

- (NSMutableArray *)fetchContactWithAddressBook:(ABAddressBookRef)addressBook{
    if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusAuthorized) {有权限访问
        //获取联系人数组
        NSArray *array = (__bridge NSArray *)ABAddressBookCopyArrayOfAllPeople(addressBook);
        NSMutableArray *contacts = [NSMutableArray array];
        for (int i = 0; i < array.count; i++) {
            //获取联系人
            ABRecordRef people = CFArrayGetValueAtIndex((__bridge ABRecordRef)array, i);
            //获取联系人详细信息,如:姓名,电话,住址等信息
            NSString *firstName = (__bridge NSString *)ABRecordCopyValue(people, kABPersonFirstNameProperty);
            NSString *lastName = (__bridge NSString *)ABRecordCopyValue(people, kABPersonLastNameProperty);

            //判断姓名null
            NSString *allName;
            if ([CommandHelp checkStringIsNull:lastName] && [CommandHelp checkStringIsNull:firstName]) {
                allName = [NSString stringWithFormat:@"%@%@",lastName,firstName];
            }else if([CommandHelp checkStringIsNull:firstName]){
                allName = firstName;
            }else if ([CommandHelp checkStringIsNull:lastName]){
                allName = lastName;
            }else{
                allName = @"";
            }

            ABMutableMultiValueRef phoneNumRef = ABRecordCopyValue(people, kABPersonPhoneProperty);
            NSString *phoneNumber =  ((__bridge NSArray *)ABMultiValueCopyArrayOfAllValues(phoneNumRef)).lastObject;
            //判断手机号null
            NSString *phone;
            if ([CommandHelp checkStringIsNull:phoneNumber]) {
                phone = phoneNumber;
            }else{
                phone = @"";
            }

            //如果不加上面的判断,这里加入数组的时候会出错,不会判断(null)这个东西,所以要先排除
            [contacts addObject:@{@"name": allName, @"phoneNumber": phone}];

        }
        return contacts;
    }else{//无权限访问
        //提示授权
        UIAlertView * alart = [[UIAlertView alloc]initWithTitle:@"温馨提示" message:@"请您设置允许APP访问您的通讯录\n设置-隐私-通讯录" delegate:self cancelButtonTitle:@"确定" otherButtonTitles:nil, nil];
        [alart show];
        return nil;
    }
}



4、获取数据示例


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值