IOS 获取通讯录中信息

获取通讯录中信息

一. 我们设置一个ABAddressBookRef类型的属性addressBook

二. 要获得通讯录中的信息,我们需要获取访问通讯录的权限。

在运行下面的获取权限的方法的时候,系统会自动跳出来一个alterView,询问是否允许访问通讯录。(注意这个访问只会执行一次,之后即使我们删除了这个app,下次在下载回来,这个询问也不会再执行了)

    CFErrorRef error;
    addressBook = ABAddressBookCreateWithOptions(NULL , &error);//获得访问通讯录的权限

三. 获取通讯录中的信息:

在获取了访问通讯录权限之后,我们需要获取通讯录中的信息,这个信息以ABAddressBookRef的类型存储。

//访问通讯录信息
        ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) {
            if (granted == YES) {
                NSLog(@"已经获取了通讯录信息");
            }else{
                NSLog(@"获取通讯录信息失败,\nerror-------%@", error);
            }
        });

四. 将通讯录中的信息转化为我们方便使用的类型

CFBridgingRelease就是将Core Foundation类型的变量转化为NSObject类。转化之后,内存改为ARC自动管理。
CFBridgingRetain就是将NSObject类型的变量转化为Core Foundation类型。转化之后,新创建的数值,内存要手动管理。

//将获取的数据转化为出来
        NSArray *addressArray = CFBridgingRelease(ABAddressBookCopyArrayOfAllPeople(addressBook));
        for(id object in addressArray){
            ABRecordRef record = CFBridgingRetain(object);//单个的记录,就是一个联系人信息

            //获取通讯录中的名字
            NSString *firstName = CFBridgingRelease(ABRecordCopyValue(record, kABPersonFirstNameProperty));
            NSLog(@"firstName --------------%@", firstName);
            //获取通讯录中的email地址
            CFArrayRef Emailarray = ABRecordCopyValue(record, kABPersonEmailProperty);
            NSArray *emails = CFBridgingRelease(ABMultiValueCopyArrayOfAllValues(Emailarray));
            for (int i = 0; i < [emails count]; i++) {
                NSLog(@"emailAddress--------------%@", [emails objectAtIndex:i]);
            }

            CFRelease(record);
        }

五. 附上源码:

#import "ViewController.h"
#import <AddressBook/AddressBook.h>

@interface ViewController ()
{
    ABAddressBookRef addressBook;
}
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    [self loadAddressBook];
    [self LoadBaseUI];
}

- (void)LoadBaseUI{
    ////TODO: 初始化界面
}

- (void)loadAddressBook{
    CFErrorRef error;
    addressBook = ABAddressBookCreateWithOptions(NULL , &error);//获得访问通讯录的权限

    if (addressBook == nil) {
        NSLog(@"通讯录权限获取失败\nerror----------%@", error);
    }else{
        //访问通讯录信息
        ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) {
            if (granted == YES) {
                NSLog(@"已经获取了通讯录信息");
            }else{
                NSLog(@"获取通讯录信息失败,\nerror-------%@", error);
            }
        });

        //将获取的数据转化为出来
        NSArray *addressArray = CFBridgingRelease(ABAddressBookCopyArrayOfAllPeople(addressBook));
        for(id object in addressArray){
            ABRecordRef record = CFBridgingRetain(object);

            //获取通讯录中的名字
            NSString *firstName = CFBridgingRelease(ABRecordCopyValue(record, kABPersonFirstNameProperty));
            NSLog(@"firstName --------------%@", firstName);
            //获取通讯录中的email地址
            CFArrayRef Emailarray = ABRecordCopyValue(record, kABPersonEmailProperty);
            NSArray *emails = CFBridgingRelease(ABMultiValueCopyArrayOfAllValues(Emailarray));
            for (int i = 0; i < [emails count]; i++) {
                NSLog(@"emailAddress--------------%@", [emails objectAtIndex:i]);
            }

            CFRelease(record);
        }
//        NSLog(@"%@", addressArray);
    }
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

/* 参考
 kABPersonFirstNameProperty,名字
 kABPersonLastNameProperty,姓氏
 kABPersonMiddleNameProperty,中间名
 kABPersonPrefixProperty,前缀
 kABPersonSuffixProperty,后缀
 kABPersonNicknameProperty,昵称
 kABPersonFirstNamePhoneticProperty,名字汉语拼音或音标
 kABPersonLastNamePhoneticProperty,姓氏汉语拼音或音标
 kABPersonMiddleNamePhoneticProperty,中间名汉语拼音或音标
 kABPersonOrganizationProperty,组织名
 kABPersonJobTitleProperty,头衔
 kABPersonDepartmentProperty,部门
 kABPersonNoteProperty,备注

 kABPersonPhoneProperty,电话号码属性,kABMultiStringPropertyType类型多值属性;
 kABPersonEmailProperty,Email属性,kABMultiStringPropertyType类型多值属性;
 kABPersonURLProperty,URL属性,kABMultiStringPropertyType类型多值属性;
 kABPersonRelatedNamesProperty,亲属关系人属性,kABMultiStringPropertyType类型多值属性;
 kABPersonAddressProperty,地址属性,kABMultiDictionaryPropertyType类型多值属性;
 kABPersonInstantMessageProperty,即时聊天属性,kABMultiDictionaryPropertyType类型多值属性;
 kABPersonSocialProfileProperty,社交账号属性,kABMultiDictionaryPropertyType类型多值属性;
 */
posted @ 2015-04-17 14:27  AbeDay  阅读(238)  评论(0编辑  收藏  举报