现在很多软件都会访问通讯录,并将通讯录的信息取得,发给服务器,然后服务器会返回相应电话号码的用户是否注册。

现在分享一下前两步,访问通讯录并处理通讯录的信息

1、导入框架

#import <AddressBook/AddressBook.h>

2.拥有属性

{

ABAddressBookRef _book;

}

以及

//联系人数组
@property (nonatomic, strong) NSMutableArray *telphoneContacts;

3.在viewDidLoad中创建通讯录对象,并请求访问权限,并执行读取通讯录的方法

    //创建通讯录对象
_book = ABAddressBookCreateWithOptions(NULL, NULL);
//1.请求权限
CYAdressBookTableViewController *weakSelf = self;
ABAddressBookRequestAccessWithCompletion(_book, ^(bool granted, CFErrorRef error) { // 用户允许应用访问通讯录数据
if (granted) {
DLog(@"用户允许应用访问通讯录数据");
      //读取通讯录
[weakSelf readContacts];
}else{ DLog(@"用户不允许应用访问通讯录数据"); [SVProgressHUD showInfoWithStatus:@"没有权限访问通讯录"]; } }); 

4.实现上一步中最后一行的读取通讯录方法。并将数组发送给服务器

///读取通讯录信息
- (void)readContacts
{
//创建一个临时数组,用于装手机号的md5值
NSMutableArray *phoneNumArray = [NSMutableArray array];
// 1.读取所有的联系人
CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople(_book);
// 2.遍历联系人
long count = CFArrayGetCount(allPeople);
for (long i = ; i < count; ++i) {
// 一个联系人的数据 就是一条记录
ABRecordRef person = CFArrayGetValueAtIndex(allPeople, i); // 获取姓
CFStringRef lastName = ABRecordCopyValue(person, kABPersonLastNameProperty); // 获取名
CFStringRef firstName = ABRecordCopyValue(person, kABPersonFirstNameProperty);
NSString *name = @"";
if (firstName && lastName) {
name = [NSString stringWithFormat:@"%@%@",lastName,firstName];
}else if(lastName && !firstName){
name = (__bridge NSString *)(lastName);
}else if(!lastName && firstName){
name = (__bridge NSString *)(firstName);
}else
{
name = @"(空)";
} //获取头像
NSData *imageData = (__bridge NSData*)ABPersonCopyImageData(person);
UIImage *image = [UIImage imageWithData:imageData]; // 获取电话号码(多个)
ABMultiValueRef phones = ABRecordCopyValue(person, kABPersonPhoneProperty);
// 获取电话号码
long phonesCount = ABMultiValueGetCount(phones);
for (long j = ; j < phonesCount; ++j) {
// 电话类型
CFStringRef phoneType = ABMultiValueCopyLabelAtIndex(phones, j); // 电话号码
CFStringRef phoneNum = ABMultiValueCopyValueAtIndex(phones, j);
NSString *telphoneNum = (__bridge NSString *)phoneNum; //过滤电话号码中间的特殊字符
NSString *telphoneNum01 = [self stringByTrimmingCharactersInSet:telphoneNum];
if (telphoneNum01.length == ) {
//如果是11位的电话,MD5之后加入数组中
[phoneNumArray addObject:telphoneNum01.md5String];
//创建一个通讯录联系人对象(提前定义好的一个联系人类)
UserInfo_TelphoneContact *contact = [[UserInfo_TelphoneContact alloc] init];
//设置电话号码
contact.telphoneNum = telphoneNum01;
//设置电话号码的md5str
contact.telphoneNumMd5Str = telphoneNum01.md5String;
//联系人名字
contact.name = name;
//头像
contact.image = image;
//将对象加入电话联系人数组中
[self.telphoneContacts addObject:contact];
} CFRelease(phoneType);
CFRelease(phoneNum);
}
CFRelease(phones);
} //将电话数组发送给服务器
[self sendPhoneNumArray:phoneNumArray]; CFRelease(allPeople);
}

5.实现第四步中的处理电话号码方法(因为iPhone的手机号码取出来是带空格或者-的)

///过滤字符串中间的特殊符号
- (NSString *)stringByTrimmingCharactersInSet:(NSString *)str
{
NSString *tempStr = @"";
for (int i = ; i < str.length; i++) {
NSString *strc = [str substringWithRange:NSMakeRange(i, )];
if (![strc isEqual: @"-"] && ![strc isEqual: @"("]&& ![strc isEqual: @")"]&& ![strc isEqual: @" "]&& ![strc isEqual: @" "] ) {
tempStr = [tempStr stringByAppendingString:strc];
}
}
return tempStr;
}

IOS开发- 访问通讯录,并将通讯录中姓名-头像-手机号码 发给服务器的更多相关文章

  1. iOS开发学习-类似微信聊天消息中的电话号码点击保存到通讯录中的功能

    类似微信聊天消息中的电话号码点击保存到通讯录中的功能,ABAddress的实现在iOS9中是不能正常使用的,点击完成后,手机会非常的卡,iOS9之后需要使用Contact新提供的方法来实现该功能.快捷 ...

  2. IOS 开发之 -- 获取本机通讯录里面所有的联系人,并传到后台

    项目中遇到一个需求,就是需要在入口的时候,获取通讯录的权限,并把所有的联系人,以接口参数的形式传到后台,通过网上查资料,历时3个小时,终于完成, 话不多,直接上代码: 1,导入系统库 #import ...

  3. iOS开发系列--扩展--播放音乐库中的音乐

    众所周知音乐是iOS的重要组成播放,无论是iPod.iTouch.iPhone还是iPad都可以在iTunes购买音乐或添加本地音乐到音乐 库中同步到你的iOS设备.在MediaPlayer.fram ...

  4. iOS开发-从16进制颜色中获取UIColor

    目前iOS中设置UIColor只能使用其枚举值.RGB等方法,不能直接将常用的16进制颜色值直接转为UIColor对象,所以写了点代码,将16进制颜色值转为UIColor. 代码如下, //头文件#i ...

  5. iOS开发读取plist文件、iphone中plist文件的

    在Xcode中建立一个iOS项目后,会自己产生一个.plist文件,点击时会看见它显示的是类似于excel表格: 但是,如果打开方式选择Source Code,你会看见它其实是一个xml文件. 我们会 ...

  6. iOS开发—在@interface,@implementation和@property中变量的定义

    一直搞不懂在OC中变量在@interface和@implementation中有什么区别,定义@property又有什么不同,查了很多资料,总结如下: //ViewController.h @inte ...

  7. iOS开发小技巧--TableView Group样式中控制每个section之间的距离

    一.TableView的Group样式中,默认的每个section都有sectionHeader和sectionFooter,只要调整这两个的大小就可以实现section之前的间距扩大或缩小 二.项目 ...

  8. IOS开发中将定时器添加到runLoop中

    runLoop主要就是为线程而生的.他能够让线程在有任务的时候保持工作状态,没有任务的时候让线程处于休眠待备状态. 主线程的runloop默认是开启的.主线程上创建的定时器已经默认添加到runLoop ...

  9. iOS开发RunnLoop学习二:GCD中的定时器

    #import "ViewController.h" @interface ViewController () /** 注释 */ @property (nonatomic, st ...

随机推荐

  1. 多线程 Synchronized关键字和Lock

    Synchronized  分为实例锁和全局锁. 实例锁为 synchronized(this) 和 非static synchronized方法.   也加对象锁. 只要一个线程访问这类的一个syn ...

  2. 关于VR开发中的穿墙问题随想

    在VR开发中,用户将以第一人称的视角进入虚拟世界,即用户同时身处两个坐标系:1. 现实世界坐标系(如房间的坐标系),用户的身体处于这个坐标系 2. VR世界坐标系,用户的感官处于这个坐标系,即用户觉得 ...

  3. 一个基于H5audio标签的vue音乐播放器

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. selenium2自动化测试学习笔记(一)

    从这周开始学习自动化测试,采用selenium2,目标是在本月学习到appium,并测试公司的真实APP项目. 系统环境:win10 语言:python3.6.4 工具:selenium2 IDE:p ...

  5. 设置如何远程连接mysql数据库

    安装好mysql5.6.37后,默认情况下,只允许本地登录,禁止远程登录. 可以现在本地安装好连接工具,比如sqlyog或者navicat 登陆后,切换至mysql数据库 执行下面2条语句 '; FL ...

  6. C语言第一次博客作业—输入输出

    一.PTA实验作业 题目1:7-3 温度转换 本题要求编写程序,计算华氏温度150°F对应的摄氏温度.计算公式:C=5×(F−32)/9,式中:C表示摄氏温度,F表示华氏温度,输出数据要求为整型. 1 ...

  7. alpha-咸鱼冲刺day1

    一,合照 emmmmm.自然是没有的. 二,项目燃尽图 三,项目进展 登陆界面随意写了一下.(明天用来做测试的) 把学姐给我的模板改成了自家的个人主页界面,侧边栏啥的都弄出来了(快撒花花!) 四,问题 ...

  8. Alpha冲刺Day12

    Alpha冲刺Day12 一:站立式会议 今日安排: 由黄腾飞和张梨贤继续完成政府人员模块下的风险管控子模块下的分级统计展示 由林静继续完成企业注册模块 由周静平完成登录页面模块 二:实际项目进展 人 ...

  9. 从PRISM开始学WPF(五)MVVM(一)ViewModel?

    从PRISM开始学WPF(一)WPF? 从PRISM开始学WPF(二)Prism? 从PRISM开始学WPF(三)Prism-Region? 从PRISM开始学WPF(四)Prism-Module? ...

  10. BM V7000数据恢复成功案例;服务器数据恢复

    IBM V7000存储是一款定位中端的存储设备,很多企业选择该服务器作为存储,最近北亚数据恢复中心接到一例V7000服务器数据恢复案例,下面将对本次数据恢复的过程和数据恢复方法进行归纳总结,希望对各位 ...