最近项目需求:需要获取用户的通讯录,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。
希望对大家有用。
网友评论