利用AddressBook.framework框架获取iOS系统通讯录数据

此方法是使用AddressBook.framework框架获取通讯录信息

第一步、在info.plist文件里面配置访问权限

第二步、导入头文件

1 #import <AddressBook/AddressBook.h>
2 #import <AddressBookUI/AddressBookUI.h>

第三步、获取通讯录数据

 1 - (void)getSystemAddress{
 2
 3     //新建一个通讯录类
 4     ABAddressBookRef addressBooks = nil;
 5     //判断是否在ios6.0版本以上
 6     if ([[UIDevice currentDevice].systemVersion floatValue] >= 6.0)
 7     {
 8         addressBooks =  ABAddressBookCreateWithOptions(NULL, NULL);
 9         //获取通讯录权限
10         dispatch_semaphore_t sema = dispatch_semaphore_create(0);
11
12         ABAddressBookRequestAccessWithCompletion(addressBooks, ^(bool granted, CFErrorRef error){dispatch_semaphore_signal(sema);});
13
14         dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
15     }
16     else
17     {
18         CFErrorRef* error=nil;
19         addressBooks = ABAddressBookCreateWithOptions(NULL, error);
20     }
21
22     //获取通讯录中的所有人
23     CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople(addressBooks);
24     //通讯录中人数
25     CFIndex nPeople = ABAddressBookGetPersonCount(addressBooks);
26
27     for (NSInteger i = 0; i < nPeople; i++)
28     {
29         ABRecordRef person = CFArrayGetValueAtIndex(allPeople, i);
30         //获取个人名字
31         CFTypeRef abName = ABRecordCopyValue(person, kABPersonFirstNameProperty);
32         NSString *nameString = (__bridge NSString *)abName;
33
34         CFTypeRef abLastName = ABRecordCopyValue(person, kABPersonLastNameProperty);
35         NSString *lastNameString = (__bridge NSString *)abLastName;
36
37         CFStringRef abFullName = ABRecordCopyCompositeName(person);
38         if ((__bridge id)abFullName != nil)
39         {
40             nameString = (__bridge NSString *)abFullName;
41         }
42         else
43         {
44             if ((__bridge id)abLastName != nil){
45                 nameString = [NSString stringWithFormat:@"%@ %@", nameString, lastNameString];
46             }
47         }
48         //获取到的姓名
49         NSLog(@"name:%@", nameString);
50
51         ABPropertyID multiProperties[] = {
52             kABPersonPhoneProperty,
53             kABPersonEmailProperty
54         };
55         NSInteger multiPropertiesTotal = sizeof(multiProperties) / sizeof(ABPropertyID);
56         for (NSInteger j = 0; j < multiPropertiesTotal; j++)
57         {
58             ABPropertyID property = multiProperties[j];
59             ABMultiValueRef valuesRef = ABRecordCopyValue(person, property);
60             NSInteger valuesCount = 0;
61             if (valuesRef != nil){
62                 //获取每个联系人添加的电话号码数量
63                 valuesCount = ABMultiValueGetCount(valuesRef);
64             }
65             if (valuesCount == 0) {
66                 CFRelease(valuesRef);
67                 continue;
68             }
69             //获取电话号码和email
70                 for (NSInteger k = 0; k < valuesCount; k++)
71                 {
72                     CFTypeRef value = ABMultiValueCopyValueAtIndex(valuesRef, k);
73                     switch (j)
74                     {
75                         case 0:     // Phone number
76                         {
77                             NSString * phoneNumber = (__bridge NSString*)value;
78                             NSLog(@"电话:%@", phoneNumber);
79                             break;
80                         }
81                         case 1:     // Email
82                         {
83                             NSString *email =  (__bridge NSString*)value;
84                             NSLog(@"邮箱:%@", email);
85                             break;
86                         }
87                     }
88                     CFRelease(value);
89                 }
90         }
91     }
92 }

第四步、获取到姓名、电话、邮箱后可建立model保存,这里只是打印出来

五、扩展、其他信息的获取方法

 1 //获取当前联系人名字
 2     NSString*firstName=(__bridge NSString *)(ABRecordCopyValue(person, kABPersonFirstNameProperty));
 3     //获取当前联系人姓氏
 4     NSString*lastName=(__bridge NSString *)(ABRecordCopyValue(person, kABPersonLastNameProperty));
 5     //获取当前联系人中间名
 6     NSString*middleName=(__bridge NSString*)(ABRecordCopyValue(person, kABPersonMiddleNameProperty));
 7     //获取当前联系人的名字前缀
 8     NSString*prefix=(__bridge NSString*)(ABRecordCopyValue(person, kABPersonPrefixProperty));
 9     //获取当前联系人的名字后缀
10     NSString*suffix=(__bridge NSString*)(ABRecordCopyValue(person, kABPersonSuffixProperty));
11     //获取当前联系人的昵称
12     NSString*nickName=(__bridge NSString*)(ABRecordCopyValue(person, kABPersonNicknameProperty));
13     //获取当前联系人的名字拼音
14     NSString*firstNamePhoneic=(__bridge NSString*)(ABRecordCopyValue(person, kABPersonFirstNamePhoneticProperty));
15     //获取当前联系人的姓氏拼音
16     NSString*lastNamePhoneic=(__bridge NSString*)(ABRecordCopyValue(person, kABPersonLastNamePhoneticProperty));
17     //获取当前联系人的中间名拼音
18     NSString*middleNamePhoneic=(__bridge NSString*)(ABRecordCopyValue(person, kABPersonMiddleNamePhoneticProperty));
19     //获取当前联系人的公司
20     NSString*organization=(__bridge NSString*)(ABRecordCopyValue(person, kABPersonOrganizationProperty));
21     //获取当前联系人的职位
22     NSString*job=(__bridge NSString*)(ABRecordCopyValue(person, kABPersonJobTitleProperty));
23     //获取当前联系人的部门
24     NSString*department=(__bridge NSString*)(ABRecordCopyValue(person, kABPersonDepartmentProperty));
25     //获取当前联系人的生日
26     NSString*birthday=(__bridge NSDate*)(ABRecordCopyValue(person, kABPersonBirthdayProperty));
27     NSMutableArray * emailArr = [[NSMutableArray alloc]init];
28     //获取当前联系人的邮箱 注意是数组
29     ABMultiValueRef emails= ABRecordCopyValue(person, kABPersonEmailProperty);
30     for (NSInteger j=0; j<ABMultiValueGetCount(emails); j++) {
31         [emailArr addObject:(__bridge NSString *)(ABMultiValueCopyValueAtIndex(emails, j))];
32     }
33     //获取当前联系人的备注
34     NSString*notes=(__bridge NSString*)(ABRecordCopyValue(person, kABPersonNoteProperty));
35     //获取创建当前联系人的时间 注意是NSDate
36     NSDate*creatTime=(__bridge NSDate*)(ABRecordCopyValue(person, kABPersonCreationDateProperty));
37     //获取最近修改当前联系人的时间
38     NSDate*alterTime=(__bridge NSDate*)(ABRecordCopyValue(person, kABPersonModificationDateProperty));
39     //获取地址
40     ABMultiValueRef address = ABRecordCopyValue(person, kABPersonAddressProperty);
41     for (int j=0; j<ABMultiValueGetCount(address); j++) {
42         //地址类型
43         NSString *type = (__bridge NSString *)(ABMultiValueCopyLabelAtIndex(address, j));
44         NSDictionary * temDic = (__bridge NSDictionary *)(ABMultiValueCopyValueAtIndex(address, j));
45         //地址字符串,可以按需求格式化
46         NSString * adress = [NSString stringWithFormat:@"国家:%@\n省:%@\n市:%@\n街道:%@\n邮编:%@",[temDic valueForKey:(NSString*)kABPersonAddressCountryKey],[temDic valueForKey:(NSString*)kABPersonAddressStateKey],[temDic valueForKey:(NSString*)kABPersonAddressCityKey],[temDic valueForKey:(NSString*)kABPersonAddressStreetKey],[temDic valueForKey:(NSString*)kABPersonAddressZIPKey]];
47     }
48     //获取当前联系人头像图片
49     NSData*userImage=(__bridge NSData*)(ABPersonCopyImageData(person));
50     //获取当前联系人纪念日
51     NSMutableArray * dateArr = [[NSMutableArray alloc]init];
52     ABMultiValueRef dates= ABRecordCopyValue(person, kABPersonDateProperty);
53     for (NSInteger j=0; j<ABMultiValueGetCount(dates); j++) {
54         //获取纪念日日期
55         NSDate * data =(__bridge NSDate*)(ABMultiValueCopyValueAtIndex(dates, j));
56         //获取纪念日名称
57         NSString * str =(__bridge NSString*)(ABMultiValueCopyLabelAtIndex(dates, j));
58         NSDictionary * temDic = [NSDictionary dictionaryWithObject:data forKey:str];
59         [dateArr addObject:temDic];
60     }
时间: 2024-10-16 07:46:30

利用AddressBook.framework框架获取iOS系统通讯录数据的相关文章

获取iOS系统版本和设备的电量

获取iOS系统版本 --- UIDevice的使用 UIDevice类是一个单例,其唯一的实例( [UIDevice currentDevice] ) 代表了当前使用的设备. 通过这个实例,可以获得设备的相关信息(包括系统名称,版本号,设备模式等等). 也可以使用使用该实例来监测设备的特征(比如物理方向). NSString *strName = [[UIDevice currentDevice] name]; // 设备名称 NSString *strId = [[UIDevice curre

关于访问iOS系统通讯录方法。

一.在iOS中,有2个框架可以访问用户的通讯录: 1.AddressBookUI.framework>提供了系统自带联系人列表界面.联系人详情界面.添加联系人界面等.>一般用于选择联系人. 2.AddressBook.framework>纯C语言的API,仅仅是获得联系人数据.>没有提供UI界面展示,需要自己搭建联系人展示界面.>里面的数据类型大部分基于Core Foundation框架,使用较难. 二.但是从iOS6开始,需要得到用户的授权才能访问通讯录,因此在使用之前,需

获取iOS系统版本

获取ios设备系统信息的方法 之 [UIDevice currentDevice] 获取iphone的系统信息使用[UIDevice currentDevice],信息如下: [[UIDevice currentDevice] systemName]:系统名称,如iPhone OS [[UIDevice currentDevice] systemVersion]:系统版本,如4.2.1 [[UIDevice currentDevice] model]:The model of the devic

获取iOS系统版本号,慎重使用[[[UIDevice currentDevice] systemVersion] floatValue]——【sdk缺陷】

iOS 最常见的获取系统版本的方法是: [[[UIDevice currentDevice] systemVersion] floatValue] 可是.这个floatValue是不靠谱的,这也算是iOS SDK的一个bug吧.看一下上面的函数在8.2系统上的表现. 假设代码中有 if( version >= 8.2) 的推断,则该推断会失效. 所以,还是使用字符串对照版本比較靠谱.

获取iOS系统版本,谨慎使用[[[UIDevice currentDevice] systemVersion] floatValue]

iOS 最常见的获取系统版本号的方法是: [[[UIDevice currentDevice] systemVersion] floatValue] 但是,这个floatValue是不靠谱的,这也算是iOS SDK的一个bug吧.看一下上面的函数在8.2系统上的表现. 如果代码中有 if( version >= 8.2) 的判断,则该判断会失效! 所以,还是使用字符串对比版本号比较靠谱.

获取iOS系统版本 --- UIDevice的使用

UIDevice类是一个单例,其唯一的实例( [UIDevice currentDevice] ) 代表了当前使用的设备. 通过这个实例,可以获得设备的相关信息(包括系统名称,版本号,设备模式等等). 也可以使用使用该实例来监测设备的特征(比如物理方向). NSString *strName = [[UIDevice currentDevice] name]; // Name of the phone as named by user 系统工具名称 NSString *strId = [[UID

ios 读取通讯录数据

#import <Foundation/Foundation.h> @interface LoadingContactData : NSObject // 读取通讯录 + (LoadingContactData *)shareIntance; - (void)getContactData; @end #import "LoadingContactData.h" static LoadingContactData *_contactData; @implementation

Git.Framework 框架随手记--ORM查询数据集合 一

本文记录Git.Framework之ORM中最为浓墨重彩的一篇,查询集合.根据自己做的项目统计这个是使用频率最高的一个. 一. 查询集合方法简介 (1)List<T> GetList(); (2)List<T> GetList(bool isOpenTrans); (3)List<T> GetList(T entity); (4)List<V> GetList<V>(T entity) where V : class, new(); (5)Lis

利用解构赋值获取后端特定字段数据

很多时候,后端接口传过来的数据并不正好是我们需要的.有些场景下会有很多不需要的字段. 这时如果采用单个赋值的方法赋值数据无疑会比较麻烦.解决的办法就是利用解构赋值. mounted(){ let objs ={ name:'test', sex:'nan', caree:'kaifa', height:180, country:'country' }; ({name:this.obj.name,caree:this.obj.caree}=objs); ({height:this.obj.heig