1、读取通信录

  1)、9.0以前:AddressBook

  2)、9.0以后:Contacts

2、调用通信录UI(不弄)

  1)、9.0以前:AddressBookUI

  2)、9.0以后:ContactsUI

3、参考

0、写在前面

  1)、plist 需要设置 隐私权限描述

    NSContactsUsageDescription(Privacy - Contacts Usage Description) :请求访问通讯录(自定义)

  2)、一般应用只需要电话就够了,不过,如果想做 坏事 大数据分析,可能还是要全读取给后台吧?

  3)、9.0后的 Contacts 类:

    3-1)、如果请求数据的数组里没有该Key,但在 block 判断有,会奔溃。

    3-2)、请求类型key,有10.0后的,需要注意,做判断。               

  4)、原生UI不打算弄了,感觉一般都是自定义UI,比如:有注册的在上面,添加好友按钮,没注册的在下面,邀请好友按钮。

  5)、有空再整理成 单例manage。

1、读取通信录

  1)、9.0以前

    1-1)、头文件

#import <AddressBook/AddressBook.h>

    1-2)、判断是否有权限

- (void)DetermineAndReadAddressBook
{// 判断是否授权ABAuthorizationStatus authorizationStatus = ABAddressBookGetAuthorizationStatus();if (authorizationStatus == kABAuthorizationStatusNotDetermined) {// 请求授权ABAddressBookRef addressBookRef = ABAddressBookCreateWithOptions(NULL, NULL);ABAddressBookRequestAccessWithCompletion(addressBookRef, ^(bool granted, CFErrorRef error){if (granted) {// 授权成功[self readAddressBook];} else {// 授权失败NSLog(@"提示:用户取消授权,读取失败");}});}else if (authorizationStatus == kABAuthorizationStatusAuthorized){// 授权过[self readAddressBook];}else {dispatch_async(dispatch_get_main_queue(), ^{// 更新界面NSLog(@"提示:应用-通信录 设置");});}
}

    1-3)、读取并保存模型(未做)

- (void)readAddressBook {// 获取所有联系人ABAddressBookRef addressBookRef = ABAddressBookCreate();// 获取所有联系人 数据CFArrayRef peoples = ABAddressBookCopyArrayOfAllPeople(addressBookRef);// 获取所有联系人 个数CFIndex peoplesCount = ABAddressBookGetPersonCount(addressBookRef);for (int i = 0; i < peoplesCount; i++) {//获取联系人对象的引用ABRecordRef people = CFArrayGetValueAtIndex(peoples, i);//获取当前联系人名字NSString *firstName=(__bridge NSString *)(ABRecordCopyValue(people, kABPersonFirstNameProperty));//获取当前联系人姓氏NSString *lastName=(__bridge NSString *)(ABRecordCopyValue(people, kABPersonLastNameProperty));NSLog(@"--------------------------------------------------");NSLog(@"firstName=%@, lastName=%@", firstName, lastName);//获取当前联系人中间名NSString *middleName=(__bridge NSString*)(ABRecordCopyValue(people, kABPersonMiddleNameProperty));//获取当前联系人的名字前缀NSString *prefix=(__bridge NSString*)(ABRecordCopyValue(people, kABPersonPrefixProperty));//获取当前联系人的名字后缀NSString *suffix=(__bridge NSString*)(ABRecordCopyValue(people, kABPersonSuffixProperty));//获取当前联系人的昵称NSString *nickName=(__bridge NSString*)(ABRecordCopyValue(people, kABPersonNicknameProperty));//获取当前联系人的名字拼音NSString *firstNamePhoneic=(__bridge NSString*)(ABRecordCopyValue(people, kABPersonFirstNamePhoneticProperty));//获取当前联系人的姓氏拼音NSString *lastNamePhoneic=(__bridge NSString*)(ABRecordCopyValue(people, kABPersonLastNamePhoneticProperty));//获取当前联系人的中间名拼音NSString *middleNamePhoneic=(__bridge NSString*)(ABRecordCopyValue(people, kABPersonMiddleNamePhoneticProperty));//获取当前联系人的公司NSString *organization=(__bridge NSString*)(ABRecordCopyValue(people, kABPersonOrganizationProperty));//获取当前联系人的职位NSString *job=(__bridge NSString*)(ABRecordCopyValue(people, kABPersonJobTitleProperty));//获取当前联系人的部门NSString *department=(__bridge NSString*)(ABRecordCopyValue(people, kABPersonDepartmentProperty));//获取当前联系人的生日NSDate *birthday=(__bridge NSDate*)(ABRecordCopyValue(people, kABPersonBirthdayProperty));//获取当前联系人的备注NSString *notes=(__bridge NSString*)(ABRecordCopyValue(people, kABPersonNoteProperty));//获取当前联系人头像图片NSData *userImage=(__bridge NSData*)(ABPersonCopyImageData(people));//获取kind值CFNumberRef kindType = ABRecordCopyValue(people, kABPersonKindProperty);if (kindType == kABPersonKindOrganization) {NSLog(@"公司");} else {// it's a person, resource, or roomNSLog(@"个人");}//获取创建当前联系人的时间 注意是NSDateNSDate *creatTime=(__bridge NSDate*)(ABRecordCopyValue(people, kABPersonCreationDateProperty));//获取最近修改当前联系人的时间NSDate *alterTime=(__bridge NSDate*)(ABRecordCopyValue(people, kABPersonModificationDateProperty));//获取当前联系人的电话 数组NSMutableArray *phoneArray = [[NSMutableArray alloc]init];ABMultiValueRef phones = ABRecordCopyValue(people, kABPersonPhoneProperty);CFIndex phonesCount = ABMultiValueGetCount(phones);for (NSInteger j=0; j<phonesCount; j++) {//获取电话LabelNSString *phoneLabel = (__bridge NSString*)ABAddressBookCopyLocalizedLabel(ABMultiValueCopyLabelAtIndex(phones, j));//获取該Label下的电话值NSString *phone = (__bridge NSString *)(ABMultiValueCopyValueAtIndex(phones, j));NSLog(@"phone=%@", phone);[phoneArray addObject:phone];}//获取IM多值NSMutableArray *instantMessageArray = [[NSMutableArray alloc]init];ABMultiValueRef instantMessages = ABRecordCopyValue(people, kABPersonInstantMessageProperty);CFIndex instantMessagesCount = ABMultiValueGetCount(instantMessages);for (int j = 1; j < instantMessagesCount; j++){//获取IM LabelNSString* instantMessageLabel = (__bridge NSString*)ABMultiValueCopyLabelAtIndex(instantMessages, j);//获取IM 的内容NSDictionary* instantMessageContent =(__bridge NSDictionary*)ABMultiValueCopyValueAtIndex(instantMessages, j);NSString* username = [instantMessageContent valueForKey:(NSString *)kABPersonInstantMessageUsernameKey];NSString* service = [instantMessageContent valueForKey:(NSString *)kABPersonInstantMessageServiceKey];}//获取URL多值NSMutableArray *urlArray = [[NSMutableArray alloc]init];ABMultiValueRef urls = ABRecordCopyValue(people, kABPersonURLProperty);CFIndex urlsCount = ABMultiValueGetCount(urls);for (int j = 0; j < urlsCount; j++){//获取电话LabelNSString * urlLabel = (__bridge NSString*)ABAddressBookCopyLocalizedLabel(ABMultiValueCopyLabelAtIndex(urls, j));//获取該Label下的电话值NSString * urlContent = (__bridge NSString*)ABMultiValueCopyValueAtIndex(urls,j);}//获取当前联系人的邮箱 注意是数组NSMutableArray *emailArray = [[NSMutableArray alloc]init];ABMultiValueRef emails= ABRecordCopyValue(people, kABPersonEmailProperty);CFIndex emailsCount = ABMultiValueGetCount(emails);for (NSInteger j=0; j< emailsCount; j++) {//获取email LabelNSString* emailLabel = (__bridge NSString*)ABAddressBookCopyLocalizedLabel(ABMultiValueCopyLabelAtIndex(emails, j));//获取email值NSString *email = (__bridge NSString *)(ABMultiValueCopyValueAtIndex(emails, j));NSLog(@"email=%@", email);[emailArray addObject:email];}//获取地址 注意是数组NSMutableArray *addressArray = [[NSMutableArray alloc]init];ABMultiValueRef addresss = ABRecordCopyValue(people, kABPersonAddressProperty);CFIndex addresssCount = ABMultiValueGetCount(addresss);for (int j=0; j<addresssCount; j++) {// 地址类型NSString *addressLabel = (__bridge NSString *)(ABMultiValueCopyLabelAtIndex(addresss, j));NSDictionary * personaddress = (__bridge NSDictionary *)(ABMultiValueCopyValueAtIndex(addresss, j));// 获取地址NSString* country = [personaddress valueForKey:(NSString *)kABPersonAddressCountryKey];NSString* state = [personaddress valueForKey:(NSString *)kABPersonAddressStateKey];NSString* city = [personaddress valueForKey:(NSString *)kABPersonAddressCityKey];NSString* street = [personaddress valueForKey:(NSString *)kABPersonAddressStreetKey];NSString* zip = [personaddress valueForKey:(NSString *)kABPersonAddressZIPKey];NSString* coutntrycode = [personaddress valueForKey:(NSString *)kABPersonAddressCountryCodeKey];//地址字符串,可以按需求格式化NSString *adress = [NSString stringWithFormat:@"国家:%@\n省:%@\n市:%@\n街道:%@\n邮编:%@",country,state,city,street,zip];}//获取当前联系人纪念日NSMutableArray *dateArr = [[NSMutableArray alloc]init];ABMultiValueRef dates= ABRecordCopyValue(people, kABPersonDateProperty);CFIndex datesCount = ABMultiValueGetCount(dates);for (NSInteger j=0; j<datesCount; j++) {//获取dates LabelNSString* dateLabel = (__bridge NSString*)ABAddressBookCopyLocalizedLabel(ABMultiValueCopyLabelAtIndex(dates, j));//获取纪念日日期NSDate *date =(__bridge NSDate*)(ABMultiValueCopyValueAtIndex(dates, j));//获取纪念日名称NSString *str =(__bridge NSString*)(ABMultiValueCopyLabelAtIndex(dates, j));NSDictionary *tempDic = [NSDictionary dictionaryWithObject:date forKey:str];[dateArr addObject:tempDic];}}
}

  2)、9.0以后

    2-1)、头文件

#import <Contacts/Contacts.h>

    2-2)、判断是否有权限

- (void)DetermineAndReadAddressBook
{// 判断是否授权CNAuthorizationStatus authorizationStatus = [CNContactStore authorizationStatusForEntityType:CNEntityTypeContacts];if (authorizationStatus == CNAuthorizationStatusNotDetermined) {CNContactStore *contactStore = [[CNContactStore alloc] init];[contactStore requestAccessForEntityType:CNEntityTypeContacts completionHandler:^(BOOL granted, NSError * _Nullable error) {if (granted) {// 授权成功[self readAddressBook];} else {// 授权失败NSLog(@"提示:用户取消授权,读取失败");}}];}else if (authorizationStatus == CNAuthorizationStatusAuthorized){// 授权过[self readAddressBook];}else {dispatch_async(dispatch_get_main_queue(), ^{// 更新界面NSLog(@"提示:应用-通信录 设置");});}
}

    2-3)、读取并保存模型(未做)

- (void)readAddressBook {// 获取指定的字段,如果这里不列出,在下面block读取,会奔溃。注意,有一个是10.0以后的。NSArray *keysToFetch = @[CNContactNamePrefixKey,CNContactGivenNameKey,CNContactMiddleNameKey,CNContactFamilyNameKey,CNContactPreviousFamilyNameKey,CNContactNameSuffixKey,CNContactNicknameKey,CNContactOrganizationNameKey,CNContactDepartmentNameKey,CNContactJobTitleKey,CNContactPhoneticGivenNameKey,CNContactPhoneticMiddleNameKey,CNContactPhoneticFamilyNameKey,CNContactPhoneticOrganizationNameKey,    // 10.0CNContactBirthdayKey,CNContactNonGregorianBirthdayKey,CNContactNoteKey,CNContactImageDataKey,CNContactThumbnailImageDataKey,CNContactImageDataAvailableKey,CNContactTypeKey,CNContactPhoneNumbersKey,CNContactEmailAddressesKey,CNContactPostalAddressesKey,CNContactDatesKey,CNContactUrlAddressesKey,CNContactRelationsKey,CNContactSocialProfilesKey,CNContactInstantMessageAddressesKey];CNContactFetchRequest *fetchRequest = [[CNContactFetchRequest alloc] initWithKeysToFetch:keysToFetch];CNContactStore *contactStore = [[CNContactStore alloc] init];[contactStore enumerateContactsWithFetchRequest:fetchRequest error:nil usingBlock:^(CNContact * _Nonnull contact, BOOL * _Nonnull stop) {// 获取名字NSString *givenName = contact.givenName;NSString *familyName = contact.familyName;NSLog(@"-------------------------------------------------------");NSLog(@"givenName=%@, familyName=%@", givenName, familyName);// 获取电话NSArray *phoneNumbers = contact.phoneNumbers;for (CNLabeledValue *labelValue in phoneNumbers) {NSString *label = labelValue.label;CNPhoneNumber *phoneNumber = labelValue.value;NSLog(@"label=%@, phone=%@", label, phoneNumber.stringValue);}// 获取对方IMNSArray *ims = contact.instantMessageAddresses;for (CNLabeledValue *labelValue in ims) {NSString *label = labelValue.label;CNInstantMessageAddress *adds = labelValue.value;NSLog(@"label=%@, add.username=%@,add.service=%@", label, adds.username , adds.service);}//        *stop = YES;  // 停止循环,相当于break;}];
}

  

3、参考

《iOS的通讯录开发》         --千煌89    简书

《iOS 获取通讯录的4种方式详解》   --vbirdbest   CSDN

转载于:https://www.cnblogs.com/leonlincq/p/8304249.html

iOS:通信录(完成)(18-01-18更)相关推荐

  1. MIT 18.01 Single Variable Calculus(单变量微积分)课堂笔记【6】——近似和求最值

    1. 线性和二阶近似 当函数比较复杂时,可以使用线性近似或者二阶近似来近似原函数.可以使求解更加容易.二阶近似是线性近似的扩展. 1.1 线性近似 使用在某个特定点(一般是0点)处的切线来近似原函数, ...

  2. 乐视网CEO梁军:现在就是缺钱 正在重新学习做生意 2017年09月20日01:18 新京报 37 微博 微信 QQ空间 添加喜爱 乐视网CEO梁军。 新京报记者 吴江 摄乐视网CEO梁军。 新京

    乐视网CEO梁军:现在就是缺钱 正在重新学习做生意 2017年09月20日01:18 新京报 37微博微信QQ空间添加喜爱 乐视网CEO梁军. 新京报记者 吴江 摄 乐视网(15.330, 0.00, ...

  3. MIT 18.01 单变量微积分笔记——总目录及对应链接

    0. 写在前面 这篇总目录主要参考了MIT 18.01单变量微积分的课程结构,当然我也做了一些我认为更合理的思路上的改动.给自己定个小目标,争取一周之内填补目录上的几乎所有内容,我每写完一篇就会在本目 ...

  4. (2013.01.18-2013.07.15)179天的学习小记

    (2013.01.18-2013.07.15)179天的学习小记 好久没有做个小小结咯,我的第一天学习小记是从2011.07.04开始,那时说好了在大学期间要每天记录,自我监督,就这样,这事也干了两年 ...

  5. 【347天】跃迁之路——程序员高效学习方法论探索系列(实验阶段105-2018.01.18)...

    实验说明 从2017.10.6起,开启这个系列,目标只有一个:通过探索新的学习方法,用2年的时间,实现2.5倍速的成长,获得普通程序员>= 5年的技术水平. 实验期2年(2017.10.06 - ...

  6. Mon Nov 18 01:40:52 CST 2019 WARN: Establishing SSL connection without server's identity verificatio

    今天在写ssh项目的时候,部署tomcat之后出现这样的错误 Mon Nov 18 01:40:52 CST 2019 WARN: Establishing SSL connection withou ...

  7. 微信是如何飞起来的(延伸阅读:性,微信下的机会?一个超级用户的自白:移动社交那点事类kik手机通信录互动应用前景探讨)

    与腾讯的发展史一样,微信在骂声中飞快成长--虽然既非原创,又不具备首发优势,但仅仅一年,微信竟远远超越对手们,拥有了5000万用户. 它的风行,既依托于腾讯源源不断的弹药支援,又源自其持续改进的细节拿 ...

  8. 访问通信录 适配iOS7

    昨天学习iOS中访问用户通信录的一个框架AddressBookUI.framework,这是个自带UI界面的系统框架,第一次访问要获得用户的授权. 因为是已经封装好的所以,用起来也比较方便 导入框架# ...

  9. c语言学生成员管理代码报告怎么写,C语言学生通信录管理系统课程设计报告

    <C语言学生通信录管理系统课程设计报告>由会员分享,可在线阅读,更多相关<C语言学生通信录管理系统课程设计报告(18页珍藏版)>请在人人文库网上搜索. 1.实验名称 :学生通信 ...

最新文章

  1. 如何实现把固定内容自动写入excel_Excel如何把修改记录自动写入批注?
  2. 计算机网络实验(华为eNSP模拟器)——第五章 单臂路由
  3. HDU 1874 畅通工程续 2008浙大研究生复试热身赛(2)
  4. oracle-扫盲贴:存储过程实现增删改查
  5. Redis源码分析之工具类util
  6. java学生签到系统视频教程_手把手教你做一个Java web学生信息、选课、签到考勤、成绩管理系统附带完整源码及视频开发教程...
  7. java——Runtime
  8. eos节点服务器_长期看,EOS柚子能不能达到1000元?
  9. 最简单 NDK 样例
  10. 解决centos7安装wmwaretools找不到kernel header
  11. 为什么判断list的时候,既要判断不等于null有要判断size大于0
  12. Navicat用法入门
  13. Docker教程小白实操入门(17)--如何使用run -v创建一个数据卷
  14. 单片机c语言毕业设计,单片机毕业设计的总结.docx
  15. tif转双层pdf Java_TIF文件转双层PDF时 内存不足
  16. 陈安之超级成功法则(1)
  17. uni-app 将app运行在夜神安卓模拟器
  18. 【自用错题集】C语言 基础错题整理
  19. 画一个椭圆形带扩散效果波纹展示效果
  20. 四个步骤,获取公众号文章封面图

热门文章

  1. java调用浏览器组件来_Java 网页浏览器组件介绍
  2. Swing 学习小记
  3. Integer注意_享元设计模式
  4. 习题6-5 使用函数验证哥德巴赫猜想 (20 分)
  5. 使用Bootstrap-table创建表单,并且与flask后台进行数据交互
  6. 《MySQL tips:隐式类型转换与隐式字符编码转换对查询效率的影响》
  7. python 忽略 异常_如何忽略Python中的异常?
  8. 操作系统多线程实现_操作系统中的线程实现
  9. 法学学士学位的完整形式是什么?
  10. 如何在React JS组件和React JS App中添加CSS样式?