获取通讯录中信息

一. 我们设置一个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类型多值属性;
*/

IOS 获取通讯录中信息的更多相关文章

  1. iOS 获取通讯录中联系人的所有属性 by - zfqj

    1 ABAddressBookRef addressBook = ABAddressBookCreate(); 2 3 CFArrayRef results = ABAddressBookCopyAr ...

  2. ios 获取通讯录的所有信息

    iOS获取通讯录全部信息 ABAddressBookRef addressBook = ABAddressBookCreate(); CFArrayRef results = ABAddressBoo ...

  3. iOS 获得通讯录中联系人的所有属性--b

    ABAddressBookRef addressBook = ABAddressBookCreate(); CFArrayRef results = ABAddressBookCopyArrayOfA ...

  4. ios 获得通讯录中联系人的所有属性 亲测,可行 兼容io6 和 ios 7

    //获取通讯录中的所有属性,并存储在 textView 中,已检验,切实可行.兼容io6 和 ios 7 ,而且ios7还没有权限确认提示. -(void)getAddressBook { ABAdd ...

  5. iOS获取通讯录所有联系人信息

    以下是2种方式: 第一种方法: GetAddressBook.h #import <Foundation/Foundation.h> @interface GetAddressBook : ...

  6. Android软件开发之获取通讯录联系人信息

    Android手机的通讯录联系人全部都存在系统的数据库中,如果须要获得通讯里联系人的信息就须要访问系统的数据库,才能将信息拿出来. 这一篇文章我主要带领同学们熟悉Android的通讯录机制. 图中选中 ...

  7. iOS获取通讯录 电话号码与姓名

    // 还是导入 #import <AddressBook/AddressBook.h> - (void)fetchAddressBookBeforeIOS9{ ABAddressBookR ...

  8. iOS 获取通讯录里边的电话号码AddressBook

    1  首先导入库 <AddressBook/AddressBook.h> 2 然后在导入#import <AddressBook/AddressBook.h>文件 3 声明   ...

  9. iOS 获取通讯录权限的时机

    建议将获取通讯录权限的代码放到 -(void)viewDidAppear:(BOOL)animated 或 -(void)viewWillAppear:(BOOL)animated 假如放在 view ...

随机推荐

  1. sql server 数据分页显示。

    select [ID] ,[StockApplyCode] ,[RcCode] ,[LabCenterCode] ,[LabGroupCode] ,[LabGroupName] ,[Barcode] ...

  2. 用urlencode(String str)对URL传递参数进行编码,提高安全

    在PHP 提交地址后面带有参数的时候,参数会在浏览器的地址栏暴露无疑,这样是不安全的,这个时候就必须用些方法对这些参数进行安全处理 这里可以用 urlencode(String URL);//对URL ...

  3. 为什么要用专业的ETL

    这两天一直在思考一个问题,为什么要用专业的etl工具进行数据清洗,原因如下: ETL负责将分布的.异构数据源中的数据如关系数据.平面数据文件等抽取到临时中间层后进行清洗.转换.集成,最后加载到数据仓库 ...

  4. 优秀开源项目的svn地址

    很多优秀的开源项目已经提供SVN源码签出了,无论是解疑还是学习,都是一大幸福之事啊! Apache的SVN库,强烈推荐! http://svn.apache.org/repos/asf/ 里面不但有S ...

  5. MiniProfiler.3.0.10 用于MVC4.0中不能显示SQL语句

    MiniProfiler.3.0.10 用于MVC4.0中可以显示执行时间,但是不能显示SQL语句,怎么解决?

  6. Ombrophobic Bovines

    poj2391:http://poj.org/problem?id=2391 题意:一个人有n个农场,每个农场都一个避雨的地方,每个农场有一些牛,每个避雨的地方能容纳牛的数量是有限的.农场之间有一些道 ...

  7. Linux 统计文件夹下文件个数

    查看统计当前目录下文件的个数,包括子目录里的. ls -lR| grep "^-" | wc -l Linux下查看某个目录下的文件.或文件夹个数用到3个命令:ls列目录.用gre ...

  8. 关于javascript document.createDocumentFragment() 替代insertCell、insertRow这种每次都使用大量的资源导致浏览器崩溃

    documentFragment 是一個無父對象的document對象他支持以下DOM2方法: appendChild, cloneNode, hasAttributes, hasChildNodes ...

  9. OpenSSH远程拒绝服务漏洞

    漏洞版本: OpenSSH 漏洞描述: Bugtraq ID:61286 OpenSSH是一种开放源码的SSH协议的实现 OpenSSH存在一个安全漏洞,允许远程攻击者利用漏洞提交恶意请求,使应用程序 ...

  10. 开源代码搜索器searchcode

    项目主页:https://searchcode.com/ 查看API:https://searchcode.com/api/ 关于:https://searchcode.com/about/ Sear ...