iOS获取本机通讯录

废话不多说,直接上干货。

一、在工程中添加AddressBook.framework和AddressBookUI.framework

二、获取通讯录

    1、在infterface中定义数组并在init方法中初始化

    NSMutableArray *addressBookTemp;

    - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil

    {

        addressBookTemp = [NSMutableArrayarray];

    }

    2、定义一个model,用来存放通讯录中的各个属性

    新建一个继承自NSObject的类,在.h中

    @interface TKAddressBook : NSObject {

        NSInteger sectionNumber;

        NSInteger recordID;

        NSString *name;

        NSString *email;

        NSString *tel;

    }

    @propertyNSInteger sectionNumber;

    @propertyNSInteger recordID;

    @property (nonatomic, retain) NSString *name;

    @property (nonatomic, retain) NSString *email;

    @property (nonatomic, retain) NSString *tel;

    @end

    在.m文件中进行synthesize

    @implementation TKAddressBook

        @synthesize name, email, tel, recordID, sectionNumber;

@end

    3、获取联系人

    在iOS6之后,获取通讯录需要获得权限

    //新建一个通讯录类

    ABAddressBookRef addressBooks = nil;

    if ([[UIDevice currentDevice].systemVersion floatValue] >= 6.0)

    {

        addressBooks =  ABAddressBookCreateWithOptions(NULL, NULL);

        //获取通讯录权限

        dispatch_semaphore_t sema = dispatch_semaphore_create(0);

        ABAddressBookRequestAccessWithCompletion(addressBooks, ^(bool granted, CFErrorRef error){dispatch_semaphore_signal(sema);});

        dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);

        dispatch_release(sema);  

    }else{

        addressBooks = ABAddressBookCreate();

    }

    //获取通讯录中的所有人

    CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople(addressBooks);

    //通讯录中人数

    CFIndex nPeople = ABAddressBookGetPersonCount(addressBooks);

    //循环,获取每个人的个人信息

    for (NSInteger i = 0; i < nPeople; i++)

    {

        //新建一个addressBook model类

        TKAddressBook *addressBook = [[TKAddressBook alloc] init];

        //获取个人

        ABRecordRef person = CFArrayGetValueAtIndex(allPeople, i);

        //获取个人名字

        CFTypeRef abName = ABRecordCopyValue(person, kABPersonFirstNameProperty);

    CFTypeRef abLastName = ABRecordCopyValue(person, kABPersonLastNameProperty);

    CFStringRef abFullName = ABRecordCopyCompositeName(person);

    NSString *nameString = (__bridge NSString *)abName;

    NSString *lastNameString = (__bridge NSString *)abLastName;

    if ((__bridgeid)abFullName != nil) {

        nameString = (__bridge NSString *)abFullName;

    } else {

        if ((__bridgeid)abLastName != nil)

        {

            nameString = [NSString stringWithFormat:@"%@ %@", nameString, lastNameString];

        }

    }

    addressBook.name = nameString;

    addressBook.recordID = (int)ABRecordGetRecordID(person);;

    ABPropertyID multiProperties[] = {

        kABPersonPhoneProperty,

        kABPersonEmailProperty

    };

    NSInteger multiPropertiesTotal = sizeof(multiProperties) / sizeof(ABPropertyID);

    for (NSInteger j = 0; j < multiPropertiesTotal; j++) {

        ABPropertyID property = multiProperties[j];

        ABMultiValueRef valuesRef = ABRecordCopyValue(person, property);

        NSInteger valuesCount = 0;

        if (valuesRef != nil) valuesCount = ABMultiValueGetCount(valuesRef);

        if (valuesCount == 0) {

            CFRelease(valuesRef);

            continue;

        }

        //获取电话号码和email

        for (NSInteger k = 0; k < valuesCount; k++) {

            CFTypeRef value = ABMultiValueCopyValueAtIndex(valuesRef, k);

            switch (j) {

                case0: {// Phone number

                    addressBook.tel = (__bridge NSString*)value;

                    break;

                }

                case1: {// Email

                    addressBook.email = (__bridge NSString*)value;

                    break;

                }

            }

            CFRelease(value);

        }

        CFRelease(valuesRef);

    }

    //将个人信息添加到数组中,循环完成后addressBookTemp中包含所有联系人的信息

    [addressBookTemp addObject:addressBook];

    if (abName) CFRelease(abName);

    if (abLastName) CFRelease(abLastName);

    if (abFullName) CFRelease(abFullName);

   三、显示在tableView中 

//行数

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {

    return1;

}

//列数

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

    return[addressBookTemp count];

}

//cell内容

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

     

    NSString *cellIdentifier = @"ContactCell";

     

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];

     

    if(cell == nil){

        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellIdentifier];

    }

 

    TKAddressBook *book = [addressBookTemp objectAtIndex:indexPath.row];

 

    cell.textLabel.text = book.name;

 

    cell.detailTextLabel.text = book.tel;

 

    returncell;

}


猜你喜欢

转载自blog.csdn.net/zhangkui0418/article/details/79310386