博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
IOS 开发之 -- 获取本机通讯录里面所有的联系人,并传到后台
阅读量:6212 次
发布时间:2019-06-21

本文共 2934 字,大约阅读时间需要 9 分钟。

项目中遇到一个需求,就是需要在入口的时候,获取通讯录的权限,并把所有的联系人,以接口参数的形式传到后台,通过网上查资料,历时3个小时,终于完成,

话不多,直接上代码:

1,导入系统库

#import 
#import
#import
#import "AddressBook.h"

2,info.plist文件里面添加权限:

key: Privacy - Contacts Usage Description

value: App需要您的同意才能访问通讯录

3,添加获取权限的方法

- (void)requestAuthorizationForAddressBook {        if ([[UIDevice currentDevice].systemVersion floatValue]>=9.0){            CNAuthorizationStatus authorizationStatus = [CNContactStore authorizationStatusForEntityType:CNEntityTypeContacts];        if (authorizationStatus == CNAuthorizationStatusNotDetermined) {            CNContactStore *contactStore = [[CNContactStore alloc] init];            [contactStore requestAccessForEntityType:CNEntityTypeContacts completionHandler:^(BOOL granted, NSError * _Nullable error) {                if (granted) {                                    } else {                    NSLog(@"授权失败, error=%@", error);                }            }];        }            }else    {        [HTools showTextOnlyHud:@"请升级系统" delay:1.0];    }        }

当然了,过低的系统,获取权限方法也不一样,可以在else方法里面自己做处理,这里我没有做处理!

4,用户点击允许后,获取通讯录所有的联系人信息:

- (void)getmyAddressbook {    CNAuthorizationStatus authorizationStatus = [CNContactStore authorizationStatusForEntityType:CNEntityTypeContacts];    if (authorizationStatus == CNAuthorizationStatusAuthorized) {        NSLog(@"没有授权...");    }        self.myDict = [[NSMutableDictionary alloc]init];        // 获取指定的字段,并不是要获取所有字段,需要指定具体的字段    NSArray *keysToFetch = @[CNContactGivenNameKey, CNContactFamilyNameKey, CNContactPhoneNumbersKey];    CNContactFetchRequest *fetchRequest = [[CNContactFetchRequest alloc] initWithKeysToFetch:keysToFetch];    CNContactStore *contactStore = [[CNContactStore alloc] init];        [contactStore enumerateContactsWithFetchRequest:fetchRequest error:nil usingBlock:^(CNContact * _Nonnull contact, BOOL * _Nonnull stop) {        NSLog(@"-------------------------------------------------------");                NSString *givenName = contact.givenName;        NSString *familyName = contact.familyName;        NSLog(@"givenName=%@, familyName=%@", givenName, familyName);                NSString *nameStr = [NSString stringWithFormat:@"%@%@",contact.familyName,contact.givenName];                NSArray *phoneNumbers = contact.phoneNumbers;                for (CNLabeledValue *labelValue in phoneNumbers) {            NSString *label = labelValue.label;            phoneNumber = labelValue.value;                        NSLog(@"label=%@, phone=%@", label, phoneNumber.stringValue);                                }                [_myDict setObject:phoneNumber.stringValue forKey:nameStr];                        //    *stop = YES; // 停止循环,相当于break;            }];            NSLog(@"mydict is ==== %@",_myDict);}

放到字典里面,然后把字典转化成json字符串,去除非法字符,通过接口,传到后台就可以了!转json字符串的方法,可以参考我写的上一篇博客:过滤掉非法字符。

 

控制台输出如下:

 

转载于:https://www.cnblogs.com/hero11223/p/6742189.html

你可能感兴趣的文章
AlphaGo Zero用它来调参?【高斯过程】到底有何过人之处?
查看>>
bash腳本編程之三 条件判断及算数运算
查看>>
php cookie
查看>>
linux下redis安装
查看>>
弃 Java 而使用 Kotlin 的你后悔了吗?| kotlin将会是最好的开发语言
查看>>
JavaScript 数据类型
查看>>
量子通信和大数据最有市场突破前景
查看>>
StringBuilder用法小结
查看>>
android studio :cannot resolve symbol R
查看>>
对‘初学者应该选择哪种编程语言’的回答——计算机达人成长之路(38)
查看>>
物联网商机迸发 LPWAN芯片现身 本文转自d1net(转载)
查看>>
Cisco Nexus 1000V
查看>>
剥开比原看代码09:通过dashboard创建密钥时,前端的数据是如何传到后端的?
查看>>
linux下恢复误删文件
查看>>
Universal-Image-Loader,android-Volley,Picasso、Fresco和Glide开源组件加载网络图片的优缺点比较...
查看>>
js call
查看>>
学习笔记之-------UIScrollView 基本用法 代理使用
查看>>
如何理解运维
查看>>
2018年,牛客网小白月赛5
查看>>
sql 锁
查看>>