IOS开发- 访问通讯录,并将通讯录中姓名-头像-手机号码 发给服务器

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

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

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(@"用户允许应用访问通讯录数据");
        }else{
            DLog(@"用户不允许应用访问通讯录数据");
            [SVProgressHUD showInfoWithStatus:@"没有权限访问通讯录"];
        }

    });
    //读取通讯录
    [weakSelf readContacts];

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

///读取通讯录信息
- (void)readContacts
{
    //创建一个临时数组,用于装手机号的md5值
    NSMutableArray *phoneNumArray = [NSMutableArray array];
    // 1.读取所有的联系人
    CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople(_book);
    // 2.遍历联系人
    long count = CFArrayGetCount(allPeople);
    for (long i = 0; 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 = 0 ; 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) {
                //如果是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 = 0; i < str.length; i++) {
        NSString  *strc = [str substringWithRange:NSMakeRange(i, 1)];
        if (![strc  isEqual: @"-"] && ![strc  isEqual: @"("]&& ![strc  isEqual: @")"]&& ![strc  isEqual: @" "]&& ![strc  isEqual: @" "] ) {
            tempStr = [tempStr stringByAppendingString:strc];
        }
    }
    return tempStr;
}
时间: 2024-12-22 20:18:48

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

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

在Xcode中建立一个iOS项目后,会自己产生一个.plist文件,点击时会看见它显示的是类似于excel表格: 但是,如果打开方式选择Source Code,你会看见它其实是一个xml文件. 我们会做一个小例子,在这个例子中我们自己建立一个plist文件并填入数据,然后运行时读取这个plist文件,并将数据填写在界面上. 首先要知道读取plist文件的方法,一般来说,使用代码 NSString *plistPath = [[NSBundle mainBundle] pathForResourc

iOS开发系列文章(持续转载中……) 感谢作者,直接连接到作者文章的

C语言 iOS开发系列--C语言之基础知识 iOS开发系列--C语言之数组和字符串 iOS开发系列--C语言之指针 iOS开发系列--C语言之预处理 iOS开发系列--C语言之存储方式和作用域 iOS开发系列--C语言之构造类型 Objective-C iOS开发系列-Objective-C之基础概览 iOS开发系列--Objective-C之类和对象 iOS开发系列--Objective-C之协议.代码块.分类 iOS开发系列-Objective-C之内存管理 iOS开发系列--Objecti

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

目前iOS中设置UIColor只能使用其枚举值.RGB等方法,不能直接将常用的16进制颜色值直接转为UIColor对象,所以写了点代码,将16进制颜色值转为UIColor. 代码如下, //头文件#import <Foundation/Foundation.h> #import <UIKit/UIKit.h> @interface TextServcie : NSObject +(UIColor *) getColorFromHEX:(NSString *)hex; @end .m

【iOS开发-模拟器】Xcode6以后mac中iOS模拟器安装路径以及程序沙箱路径

模拟器安装位置 /Users/TTF/Library/Developer/CoreSimulator/Devices/模拟器标识(一些字符串) 后面那些模拟器标识就是一些字符串代表每一个不同的iOS设备 比如D3E79030-5DB9-4E5B-8E46-5C3B100A4C1C就代表这是iPhone4S,点击进去查看device.plist这个文件就能知道. iOS应用程序资源文件位置 /Users/TTF/Library/Developer/CoreSimulator/Devices/模拟器

iOS开发之获取一段字符串中的中文字和中文字符

#pragma mark -获取一段字符串中的中文字 + (NSArray *)getAStringOfChineseWord:(NSString *)string { if (string == nil || [string isEqual:@""]) { return nil; } NSMutableArray *arr = [[NSMutableArray alloc]init]; for (int i=0; i<[string length]; i++) { int a

IOS开发基础篇 --添加的约束中所有的枚举值

/** NSLayoutConstraint类中的枚举值 *  代码添加一条约束      *      * @param Item:view1 :要约束的控件      * @param attribute:attr1 :约束的类型(做怎样的约束)      * @param relatedBy:relation :与参照控件之间的关系      * @param toItem:view2 :参照的控件      * @param attribute:attr2 :约束的类型(做怎样的约束)

ios开发-------将一个tablevirew塞进callout中

默认callout的只有一个title和detailtextlabel,所显示的信息量实在太小,虽然在地图中弹出一个小框显示一点关键信息很合理,但是有些客户需要框变大一点,信息量多一个那也是没有办法的. 效果: 我采取的方法是直接将一个tableview塞进去,但是tableView根本不能直接塞进calliout中,但可以将一个view塞进callout,我用的方法就是将tableview加到一个view上,然后在塞进callout中,上代码: self.mapView.callout.acc

iOS开发 多线程(一)GCD中dispatch队列知识

GCD编程的核心就是dispatch队列,dispatch block的执行最终都会放进某个队列中去进行,它类似NSOperationQueue但更复杂也更强大,并且可以嵌套使用.所以说,结合block实现的GCD,把函数闭包(Closure)的特性发挥得淋漓尽致. dispatch队列的生成可以有这几种方式: 1. dispatch_queue_t queue = dispatch_queue_create("com.dispatch.serial", DISPATCH_QUEUE_

iOS开发小技巧--父子控制器练习中get到的技能,控制核心动画的范围

一.未经过处理的动画是这样的,自定义的导航按钮也一起跟着转起来了. 二.自己想要的效果 三.实现这种效果的思想:核心动画要添加到view的layer上面,刚开始的情况是讲核心动画添加到了整个大view的layer上面.为了实现想要的效果,就用一个view(下面叫contentView)将要做动画的view包起来,核心动画添加到contentView 上面.