欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

iOS开发中使app获取本机通讯录的实现代码实例

程序员文章站 2023-11-14 10:27:46
一、在工程中添加addressbook.framework和addressbookui.framework 二、获取通讯录 1、在infterface中定义数组并在in...

一、在工程中添加addressbook.framework和addressbookui.framework

二、获取通讯录

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

复制代码 代码如下:

nsmutablearray *addressbooktemp;
 
- (id)initwithnibname:(nsstring *)nibnameornil bundle:(nsbundle *)nibbundleornil
{
    addressbooktemp = [nsmutablearray array];
}

2、定义一个model,用来存放通讯录中的各个属性
新建一个继承自nsobject的类,在.h中
复制代码 代码如下:

@interface tkaddressbook : nsobject {
    nsinteger sectionnumber;
    nsinteger recordid;
    nsstring *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

在.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 ((__bridge id)abfullname != nil) {
            namestring = (__bridge nsstring *)abfullname;
        } else {
            if ((__bridge id)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) {
                    case 0: {// phone number
                        addressbook.tel = (__bridge nsstring*)value;
                        break;
                    }
                    case 1: {// 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);
    }


三、显示在table中
复制代码 代码如下:

//行数
- (nsinteger)numberofsectionsintableview:(uitableview *)tableview {
    return 1;
}
 
//列数
- (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;
 
    return cell;
}


列表效果

iOS开发中使app获取本机通讯录的实现代码实例

ps:通讯录中电话号码中的"-"可以在存入数组之前进行处理,属于nsstring处理的范畴,解决办法有很多种,本文不多加说明

四、删除通讯录数据

复制代码 代码如下:

<span style="white-space:pre">    </span>abrecordref person = objc_unretainedpointer([mycontacts objectatindex:indexpath.row]); 
        cferrorref *error; 
        abaddressbookremoverecord(addressbook, person, error); 
        abaddressbooksave(addressbook, error); 
        mycontacts = nil; 
        [tableview deleterowsatindexpaths:[nsarray arraywithobject:indexpath] withrowanimation:uitableviewrowanimationfade];