iOS-授权获取通讯录

2017-03-03  本文已影响2008人  FZ_loveCarrot

最近项目需求:需要获取用户的通讯录,3个或3个以上的用户同时存在同一个电话号码时,后台就发送短信给这几个用户。推荐成为好友。

这里我只使用了一种方式,以下是介绍具体怎么使用:

1.iOS10 需要在Info.plist配置NSContactsUsageDescription

右键info.plist文件 -> open As -> Source code -> 添加以上这段代码

2.在AppDelegate.m中,引入头文件

#import <Contacts/Contacts.h>

3.接下来授权使用用户的通讯录

- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions{

//请求获取通讯录授权

[self requestAuthorizationForAddressBook];//4.授权状态

}

4.授权状态(成功/失败)

- (void)requestAuthorizationForAddressBook {

CNAuthorizationStatus authorizationStatus = [CNContactStore authorizationStatusForEntityType:CNEntityTypeContacts];

if(authorizationStatus ==CNAuthorizationStatusNotDetermined) {

CNContactStore*contactStore = [[CNContactStore alloc]init];

[contactStore requestAccessForEntityType:CNEntityTypeContacts completionHandler:^(BOOL granted,NSError*_Nullable error) {

if(granted) {

NSLog(@"通讯录获取授权成功==");

[self getContact]; //5.获取用户通讯录

}else{

NSLog(@"授权失败, error=%@", error);

}

}];

}

}

5.获取通讯录

- (void)getContact{

CNAuthorizationStatus authorizationStatus = [CNContactStore authorizationStatusForEntityType:CNEntityTypeContacts];

if(authorizationStatus ==CNAuthorizationStatusAuthorized) {

// 获取指定的字段,并不是要获取所有字段,需要指定具体的字段

NSArray*keysToFetch =@[CNContactGivenNameKey,CNContactFamilyNameKey,CNContactPhoneNumbersKey];

CNContactFetchRequest*fetchRequest = [[CNContactFetchRequest alloc]initWithKeysToFetch:keysToFetch];

CNContactStore*contactStore = [[CNContactStore alloc]init];

//创建一个保存通讯录的数组

NSMutableArray *contactArr = [NSMutableArray array];

[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);

NSArray*phoneNumbers = contact.phoneNumbers;

for(CNLabeledValue*labelValue in phoneNumbers) {

NSString*label = labelValue.label;

CNPhoneNumber*phoneNumber = labelValue.value;

NSDictionary*contact =@{@"phone":phoneNumber.stringValue,@"user":FORMAT(@"%@%@",familyName,givenName)};

[contactArr addObject:contact];

NSLog(@"label=%@, phone=%@", label, phoneNumber.stringValue);

}

//*stop = YES;// 停止循环,相当于break;

}];

_contactArr= contactArr;

NSError*error;

NSData*jsonData = [NSJSONSerialization dataWithJSONObject:contactArr options:NSJSONWritingPrettyPrinted error:&error];//此处data参数是我上面提到的key为"data"的数组

NSString*jsonString = [[NSString alloc]initWithData:jsonData encoding:NSUTF8StringEncoding];

_jsonString= jsonString;

NSLog(@"jsonString====%@",jsonString);

[self postContactTo]; //6.上传通讯录

}else{

NSLog(@"====通讯录没有授权====");

}

}

6.上传通讯录到后台(这一步就看各自公司的需求了,这里简单说一下我们公司的需求)

我司要求以json的格式上传机械id、手机号和昵称。

顺便说一下现在苹果是不允许获取udid的了。但是有位大神自己封装了一个工具类是可以模仿udid的获取的。不管你删除再重新下载同一个app。

都不会改变。分享一下地址吧:OpenUDID

希望对大家有用。

上一篇 下一篇

猜你喜欢

热点阅读