iOS 获取本机通讯录的所有属性

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

  二、获取通讯录

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

NSMutableArray *addressBookTemp;
addressBookTemp=[NSMutableArray array];

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

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

@interface TKAddressBook : NSObject{
    NSInteger sectionNumber;
    NSInteger *name;
    NSString *email;
    NSString *tel;
}

@property NSInteger sectionNumber;
@property NSInteger recordID;
///姓名
@property (nonatomic,retain) NSString *name;
///邮箱
@property (nonatomic,retain) NSString *email;
///电话
@property (nonatomic,retain) NSString *tel;
@end

  3、获取联系人

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

//获取联系人
-(void)ReadAllProple{
//取得本地通信录民柄
    ABAddressBookRef addressBook=nil;
    if ([[UIDevice currentDevice].systemVersion floatValue]>=6.0) {
        addressBook =ABAddressBookCreateWithOptions(NULL, NULL);
        //获取通讯录权限
        dispatch_semaphore_t sema=dispatch_semaphore_create(0);
        ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) {
            dispatch_semaphore_signal(sema);
        });
        dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
    }else{
        addressBook=ABAddressBookCreate();
    }
    
    //获取通讯录中的所有人
    CFArrayRef allPeople=ABAddressBookCopyArrayOfAllPeople(addressBook);
    NSLog(@"all---%@",allPeople);
    //通讯录人数
    CFIndex nPeople=ABAddressBookGetPersonCount(addressBook);
    NSLog(@"count---%li",nPeople);
    
    //获取每个人得信息
    for (NSInteger i=0; i<nPeople; i++) {
        //新建一个addressbook model类
        TKAddressBook *addBook=[[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 ((__bridge id)abFullName != nil) {
            nameString = (__bridge NSString *)abFullName;
        } else {
            if ((__bridge id)abLastName != nil)
            {
                nameString = [NSString stringWithFormat:@"%@ %@", nameString, lastNameString];
            }
        }
        NSLog(@"nastring----%@",nameString);
        
        addBook.name=nameString;
        addBook.recordID=(int)ABRecordGetRecordID(person);
        
        ABPropertyID multiPeroperties[]={
            kABPersonPhoneProperty,//读取手机号码
            kABPersonEmailProperty,//读取邮箱
           // kABPersonFirstNameProperty,//读取firstname
           // kABPersonLastNameProperty,//读取lastname
           // kABPersonMiddleNameProperty,//读取middlename
           // kABPersonPrefixProperty,// 读取prefix前缀
           //  kABPersonSuffixProperty,//读取suffix后缀
           //  kABPersonNicknameProperty,//读取nickname呢称
           //  kABPersonFirstNamePhoneticProperty,//读取firstname拼音音标
           //  kABPersonLastNamePhoneticProperty,//读取lastname拼音音标
           //  kABPersonMiddleNamePhoneticProperty,//读取middlename拼音音标
           //  kABPersonOrganizationProperty,//读取organization公司
           // kABPersonJobTitleProperty,//读取jobtitle工作
           //  kABPersonDepartmentProperty,//读取department部门
           //  kABPersonBirthdayProperty,//读取birthday生日
           //  kABPersonNoteProperty,//读取note备忘录
           //  kABPersonCreationDateProperty,//第一次添加该条记录的时间
          //   kABPersonModificationDateProperty,//最后一次修改該条记录的时间
            
        };
        NSInteger multiPropertiesTotal=sizeof(multiPeroperties)/sizeof(ABPropertyID);
        for (NSInteger j = 0; j < multiPropertiesTotal; j++) {
            ABPropertyID property = multiPeroperties[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) {
                    case 0: {// Phone number
                        addBook.tel = (__bridge NSString*)value;
                        break;
                    }
                    case 1: {// Email
                        addBook.email = (__bridge NSString*)value;
                        break;
                    }
                }
                CFRelease(value);
            }
            CFRelease(valuesRef);
        }
        //将个人信息添加到数组中,循环完成后addressBookTemp中包含所有联系人得信息
        [addressBookTemp addObject:addBook];
    }
    
    NSLog(@"b ook----%@",addressBookTemp);
}

  然后就可以用TableView显示出来:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
static NSString *acell=@"acell";
    MailListTableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:acell];
    if (!cell) {
        cell=[[[NSBundle mainBundle]loadNibNamed:@"MailListTableViewCell" owner:self options:nil]lastObject];
    }
    cell.selectionStyle=UITableViewCellSelectionStyleNone;
    TKAddressBook *book=[addressBookTemp objectAtIndex:indexPath.row];
    
    cell.lalName.text=book.name;
    cell.lalPhone.text=book.tel;
//    cell.lalRemarks.text=@"怪咖啡是腾讯自制的网络情景喜剧,在剧中的启萱是一个“怪咖啡”店长,个性孤傲、说话一针见血的女汉子。";
    cell.lalRemarks.text=book.email;
    return cell;
}

  

  以上就是整个功能的核心代码,效果如下:

 

   读取本机通讯录的基本功能已完成,其他的未写出来的属性可参考一下两个连接:

   http://www.cocoachina.com/bbs/read.php?tid=62527

     http://www.cnblogs.com/qingjoin/archive/2012/11/19/2777212.html

posted @ 2015-03-17 16:53  筱筱心意  阅读(583)  评论(0编辑  收藏  举报