iOS 获取手机通讯录联系电话

兼容iOS8.0版本,只获得手机电话,其他的通讯录信息也有注释,直接上代码了
使用方法
//通讯录

-(void)addressBookData
{
    [[AddressBookManager shareInstance] loadAddressBooksAuthorizationStatus:^(BOOL isAuthorization) {
        dispatch_async(dispatch_get_main_queue(), ^{
            NSLog(@"Authorization:%d",isAuthorization);
        });
    } withAddressBooks:^(NSArray *phionArr) {
        dispatch_async(dispatch_get_main_queue(), ^{
            NSLog(@"返回数据:%@",phionArr);
        });
    }];
}
#import <Foundation/Foundation.h>
#import <AddressBook/AddressBook.h>

#import <Contacts/Contacts.h>
#import <ContactsUI/ContactsUI.h>

@interface AddressBookManager : NSObject

+(id)shareInstance;

-(void)loadAddressBooksAuthorizationStatus:(void(^)(BOOL isAuthorization))AuthorizationBlock withAddressBooks:(void(^)(NSArray *phionArr))AddressBooksBlock;

@end
#import "AddressBookManager.h"

#define BWVersion [[[UIDevice currentDevice] systemVersion] floatValue]

@implementation AddressBookManager

+(id)shareInstance{
    static id manager;
    static dispatch_once_t oncePredicate;

    dispatch_once(&oncePredicate, ^{
        manager = [[[self class] alloc] init];
    });
    return manager;
}

-(void)loadAddressBooksAuthorizationStatus:(void (^)(BOOL))AuthorizationBlock withAddressBooks:(void (^)(NSArray *))AddressBooksBlock
{


    if (BWVersion >= 9.0) {
        [self adressBooksAboveVersion9_0AuthorizationStatus:AuthorizationBlock withAddressBooks:AddressBooksBlock];
    }else{
        [self adressBooksBelowVersion9_0AuthorizationStatus:AuthorizationBlock withAddressBooks:AddressBooksBlock];
    }



}

-(void)adressBooksAboveVersion9_0AuthorizationStatus:(void (^)(BOOL))AuthorizationBlock withAddressBooks:(void (^)(NSArray *))AddressBooksBlock
{
    // 1.获取授权状态
    CNAuthorizationStatus status = [CNContactStore authorizationStatusForEntityType:CNEntityTypeContacts];

    // 2.判断授权状态,如果不是已经授权,则直接返回
    if (status != CNAuthorizationStatusAuthorized){
        AuthorizationBlock(NO);
        AddressBooksBlock(nil);
        return;
    }

    //2.1创建储存数据数组
    NSMutableArray *phoneArray = [NSMutableArray array];

    // 3.创建通信录对象
    CNContactStore *contactStore = [[CNContactStore alloc] init];

    // 4.创建获取通信录的请求对象
    // 4.1.拿到所有打算获取的属性对应的key
    NSArray *keys = @[CNContactGivenNameKey, CNContactFamilyNameKey, CNContactPhoneNumbersKey];

    // 4.2.创建CNContactFetchRequest对象
    CNContactFetchRequest *request = [[CNContactFetchRequest alloc] initWithKeysToFetch:keys];

    // 5.遍历所有的联系人
    [contactStore enumerateContactsWithFetchRequest:request error:nil usingBlock:^(CNContact * _Nonnull contact, BOOL * _Nonnull stop) {
        // 1.获取联系人的姓名
        NSString *lastname = contact.familyName;
        NSString *firstname = contact.givenName;
        NSLog(@"%@ %@", lastname, firstname);

        // 2.获取联系人的电话号码
        NSArray *phoneNums = contact.phoneNumbers;
        for (CNLabeledValue *labeledValue in phoneNums) {
            // 2.1.获取电话号码的KEY
            NSString *phoneLabel = labeledValue.label;

            // 2.2.获取电话号码
            CNPhoneNumber *phoneNumer = labeledValue.value;
            NSString *phoneValue = phoneNumer.stringValue;

            NSLog(@"%@ %@", phoneLabel, phoneValue);

            //储存数据
            [phoneArray addObject:phoneValue];
        }

        AuthorizationBlock(YES);
        AddressBooksBlock(phoneArray);
    }];

}


-(void)adressBooksBelowVersion9_0AuthorizationStatus:(void (^)(BOOL))AuthorizationBlock withAddressBooks:(void (^)(NSArray *))AddressBooksBlock
{

     ABAddressBookRef addressBookRef = ABAddressBookCreateWithOptions(NULL, NULL);

     if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusNotDetermined) {

         //第一次申请权限
         ABAddressBookRequestAccessWithCompletion(addressBookRef, ^(bool granted, CFErrorRef error){
             CFErrorRef *error1 = NULL;
             ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, error1);
                 AuthorizationBlock(YES);
                 [self copyAddressBook:addressBook withAddressBooks:AddressBooksBlock];
             });

     }else if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusAuthorized){

         //第一次申请权限权限后
         CFErrorRef *error = NULL;
         ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, error);
              AuthorizationBlock(YES);
              [self copyAddressBook:addressBook withAddressBooks:AddressBooksBlock];
         }
     else {
         //没有获取通讯录权限
         AuthorizationBlock(NO);
         AddressBooksBlock(nil);
     }

}



- (void)copyAddressBook:(ABAddressBookRef)addressBook withAddressBooks:(void (^)(NSArray *))AddressBooksBlock
{
    CFIndex numberOfPeople = ABAddressBookGetPersonCount(addressBook);
    CFArrayRef people = ABAddressBookCopyArrayOfAllPeople(addressBook);

    //创建储存数据数组
    NSMutableArray *phoneArray = [NSMutableArray array];

    for ( int i = 0; i < numberOfPeople; i++){
        ABRecordRef person = CFArrayGetValueAtIndex(people, i);

        /*
        NSString *firstName = (__bridge NSString *)(ABRecordCopyValue(person, kABPersonFirstNameProperty));
        NSString *lastName = (__bridge NSString *)(ABRecordCopyValue(person, kABPersonLastNameProperty));

        //读取middlename
        NSString *middlename = (__bridge NSString*)ABRecordCopyValue(person, kABPersonMiddleNameProperty);
        //读取prefix前缀
        NSString *prefix = (__bridge NSString*)ABRecordCopyValue(person, kABPersonPrefixProperty);
        //读取suffix后缀
        NSString *suffix = (__bridge NSString*)ABRecordCopyValue(person, kABPersonSuffixProperty);
        //读取nickname呢称
        NSString *nickname = (__bridge NSString*)ABRecordCopyValue(person, kABPersonNicknameProperty);
        //读取firstname拼音音标
        NSString *firstnamePhonetic = (__bridge NSString*)ABRecordCopyValue(person, kABPersonFirstNamePhoneticProperty);
        //读取lastname拼音音标
        NSString *lastnamePhonetic = (__bridge NSString*)ABRecordCopyValue(person, kABPersonLastNamePhoneticProperty);
        //读取middlename拼音音标
        NSString *middlenamePhonetic = (__bridge NSString*)ABRecordCopyValue(person, kABPersonMiddleNamePhoneticProperty);
        //读取organization公司
        NSString *organization = (__bridge NSString*)ABRecordCopyValue(person, kABPersonOrganizationProperty);
        //读取jobtitle工作
        NSString *jobtitle = (__bridge NSString*)ABRecordCopyValue(person, kABPersonJobTitleProperty);
        //读取department部门
        NSString *department = (__bridge NSString*)ABRecordCopyValue(person, kABPersonDepartmentProperty);
        //读取birthday生日
        NSDate *birthday = (__bridge NSDate*)ABRecordCopyValue(person, kABPersonBirthdayProperty);
        //读取note备忘录
        NSString *note = (__bridge NSString*)ABRecordCopyValue(person, kABPersonNoteProperty);
        //第一次添加该条记录的时间
        NSString *firstknow = (__bridge NSString*)ABRecordCopyValue(person, kABPersonCreationDateProperty);
        NSLog(@"第一次添加该条记录的时间%@\n",firstknow);
        //最后一次修改該条记录的时间
        NSString *lastknow = (__bridge NSString*)ABRecordCopyValue(person, kABPersonModificationDateProperty);
        NSLog(@"最后一次修改該条记录的时间%@\n",lastknow);

        //获取email多值
        ABMultiValueRef email = ABRecordCopyValue(person, kABPersonEmailProperty);
        int emailcount = ABMultiValueGetCount(email);
        for (int x = 0; x < emailcount; x++)
        {
            //获取email Label
            NSString* emailLabel = (__bridge NSString*)ABAddressBookCopyLocalizedLabel(ABMultiValueCopyLabelAtIndex(email, x));
            //获取email值
            NSString* emailContent = (__bridge NSString*)ABMultiValueCopyValueAtIndex(email, x);
        }
        //读取地址多值
        ABMultiValueRef address = ABRecordCopyValue(person, kABPersonAddressProperty);
        int count = ABMultiValueGetCount(address);

        for(int j = 0; j < count; j++)
        {
            //获取地址Label
            NSString* addressLabel = (__bridge NSString*)ABMultiValueCopyLabelAtIndex(address, j);
            //获取該label下的地址6属性
            NSDictionary* personaddress =(__bridge NSDictionary*) ABMultiValueCopyValueAtIndex(address, j);
            NSString* country = [personaddress valueForKey:(NSString *)kABPersonAddressCountryKey];
            NSString* city = [personaddress valueForKey:(NSString *)kABPersonAddressCityKey];
            NSString* state = [personaddress valueForKey:(NSString *)kABPersonAddressStateKey];
            NSString* street = [personaddress valueForKey:(NSString *)kABPersonAddressStreetKey];
            NSString* zip = [personaddress valueForKey:(NSString *)kABPersonAddressZIPKey];
            NSString* coutntrycode = [personaddress valueForKey:(NSString *)kABPersonAddressCountryCodeKey];
        }

        //获取dates多值
        ABMultiValueRef dates = ABRecordCopyValue(person, kABPersonDateProperty);
        int datescount = ABMultiValueGetCount(dates);
        for (int y = 0; y < datescount; y++)
        {
            //获取dates Label
            NSString* datesLabel = (__bridge NSString*)ABAddressBookCopyLocalizedLabel(ABMultiValueCopyLabelAtIndex(dates, y));
            //获取dates值
            NSString* datesContent = (__bridge NSString*)ABMultiValueCopyValueAtIndex(dates, y);
        }
        //获取kind值
        CFNumberRef recordType = ABRecordCopyValue(person, kABPersonKindProperty);
        if (recordType == kABPersonKindOrganization) {
            // it's a company
            NSLog(@"it's a company\n");
        } else {
            // it's a person, resource, or room
            NSLog(@"it's a person, resource, or room\n");
        }


        //获取IM多值
        ABMultiValueRef instantMessage = ABRecordCopyValue(person, kABPersonInstantMessageProperty);
        for (int l = 1; l < ABMultiValueGetCount(instantMessage); l++)
        {
            //获取IM Label
            NSString* instantMessageLabel = (__bridge NSString*)ABMultiValueCopyLabelAtIndex(instantMessage, l);
            //获取該label下的2属性
            NSDictionary* instantMessageContent =(__bridge NSDictionary*) ABMultiValueCopyValueAtIndex(instantMessage, l);
            NSString* username = [instantMessageContent valueForKey:(NSString *)kABPersonInstantMessageUsernameKey];

            NSString* service = [instantMessageContent valueForKey:(NSString *)kABPersonInstantMessageServiceKey];
        }

        //获取URL多值
        ABMultiValueRef url = ABRecordCopyValue(person, kABPersonURLProperty);
        for (int m = 0; m < ABMultiValueGetCount(url); m++)
        {
            //获取电话Label
            NSString * urlLabel = (__bridge NSString*)ABAddressBookCopyLocalizedLabel(ABMultiValueCopyLabelAtIndex(url, m));
            //获取該Label下的电话值
            NSString * urlContent = (__bridge NSString*)ABMultiValueCopyValueAtIndex(url,m);
        }

        //读取照片
        NSData *image = (__bridge NSData*)ABPersonCopyImageData(person);
        */


        //读取电话多值
        ABMultiValueRef phone = ABRecordCopyValue(person, kABPersonPhoneProperty);
        for (int k = 0; k<ABMultiValueGetCount(phone); k++)
        {
            //获取电话Label
            NSString * personPhoneLabel = (__bridge NSString*)ABAddressBookCopyLocalizedLabel(ABMultiValueCopyLabelAtIndex(phone, k));
            //获取該Label下的电话值
            NSString * personPhone = (__bridge NSString*)ABMultiValueCopyValueAtIndex(phone, k);

            NSLog(@"personPhoneLabel:%@---personPhone:%@",personPhoneLabel,personPhone);
            [phoneArray addObject:personPhone];
        }

    }

    AddressBooksBlock(phoneArray);
}

@end
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值