服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - IOS - iOS开发中使app获取本机通讯录的实现代码实例

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

2021-01-05 12:12芳草小脚丫 IOS

这篇文章主要介绍了iOS开发中使app获取本机通讯录的实现代码实例,主要用到了AddressBook.framework和AddressBookUI.framework,代码基于传统的Objective-C,需要的朋友可以参考下

一、在工程中添加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]; 

延伸 · 阅读

精彩推荐
  • IOSiOS布局渲染之UIView方法的调用时机详解

    iOS布局渲染之UIView方法的调用时机详解

    在你刚开始开发 iOS 应用时,最难避免或者是调试的就是和布局相关的问题,下面这篇文章主要给大家介绍了关于iOS布局渲染之UIView方法调用时机的相关资料...

    windtersharp7642021-05-04
  • IOSiOS中tableview 两级cell的展开与收回的示例代码

    iOS中tableview 两级cell的展开与收回的示例代码

    本篇文章主要介绍了iOS中tableview 两级cell的展开与收回的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    J_Kang3862021-04-22
  • IOS关于iOS自适应cell行高的那些事儿

    关于iOS自适应cell行高的那些事儿

    这篇文章主要给大家介绍了关于iOS自适应cell行高的那些事儿,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的...

    daisy6092021-05-17
  • IOS解析iOS开发中的FirstResponder第一响应对象

    解析iOS开发中的FirstResponder第一响应对象

    这篇文章主要介绍了解析iOS开发中的FirstResponder第一响应对象,包括View的FirstResponder的释放问题,需要的朋友可以参考下...

    一片枫叶4662020-12-25
  • IOSIOS开发之字典转字符串的实例详解

    IOS开发之字典转字符串的实例详解

    这篇文章主要介绍了IOS开发之字典转字符串的实例详解的相关资料,希望通过本文能帮助到大家,让大家掌握这样的方法,需要的朋友可以参考下...

    苦练内功5832021-04-01
  • IOSiOS 雷达效果实例详解

    iOS 雷达效果实例详解

    这篇文章主要介绍了iOS 雷达效果实例详解的相关资料,需要的朋友可以参考下...

    SimpleWorld11022021-01-28
  • IOSiOS通过逆向理解Block的内存模型

    iOS通过逆向理解Block的内存模型

    自从对 iOS 的逆向初窥门径后,我也经常通过它来分析一些比较大的应用,参考一下这些应用中某些功能的实现。这个探索的过程乐趣多多,不仅能满足自...

    Swiftyper12832021-03-03
  • IOSIOS 屏幕适配方案实现缩放window的示例代码

    IOS 屏幕适配方案实现缩放window的示例代码

    这篇文章主要介绍了IOS 屏幕适配方案实现缩放window的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要...

    xiari5772021-06-01