一.通信录开发

  • 通信录开发主要是获取用户手机中的联系人
  • 通过获取用户的通信录,可以在应用中添加好友等

二.如何访问用户的通讯录

  • 在iOS9之前,有2个框架可以访问用户的通讯录

    • 目前需要适配iOS8,所有也必须进行学习
    • AddressBookUI.framework
      • 提供了联系人列表界面、联系人详情界面、添加联系人界面等
      • 一般用于选择联系人
    • AddressBook.framework
      • 纯C语言的API,仅仅是获得联系人数据
      • 没有提供UI界面展示,需要自己搭建联系人展示界面
      • 里面的数据类型大部分基于Core Foundation框架,使用起来极其蛋疼
  • 在iOS9开始,也有2个框架可以访问用户的通讯录
    • ContactsUI.framework

      • 对应AddressBookUI.framework
    • Contacts.framework
      • 对应AddressBook.framework

iOS9之前获取通信录

一.AddressBookUI的使用

  • 使用步骤

    • 创建选择联系人控制器
    • 设置代理
    • 实现代理方法(在代理方法中拿到用户选择的联系人)
    • 弹出控制器
  • 代码实现
     // 1.创建选择联系人的界面
ABPeoplePickerNavigationController *ppnc = [[ABPeoplePickerNavigationController alloc] init]; // 2.设置代理(在代理方法中可以拿到用户的联系人信息)
ppnc.peoplePickerDelegate = self; // 3.弹出控制器
[self presentViewController:ppnc animated:YES completion:nil];
  • 代理方法的实现
 #pragma mark - 实现ABPeoplePickerNavigationController的代理方法,在代理方法中获取通信录信息
/**
* 当选择选中一个联系人时就会执行该方法(当实现该方法时,选中了联系人会自动退出控制器)
*
* @param peoplePicker 联系人选择控制器
* @param person 选中的联系人
*/
- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker didSelectPerson:(ABRecordRef)person
{
// 1.获取联系人的姓名
CFStringRef firstName = ABRecordCopyValue(person, kABPersonFirstNameProperty);
CFStringRef lastName = ABRecordCopyValue(person, kABPersonLastNameProperty);
NSLog(@"%@ %@", firstName, lastName); // 2.获取电话号码
ABMultiValueRef phones = ABRecordCopyValue(person, kABPersonPhoneProperty);
CFIndex phoneCount = ABMultiValueGetCount(phones);
for (CFIndex i = ; i < phoneCount; i++) {
// 2.1.获取电话号码
CFStringRef phoneLabel = ABMultiValueCopyLabelAtIndex(phones, i);
CFStringRef phoneValue = ABMultiValueCopyValueAtIndex(phones, i);
NSLog(@"%@ %@", phoneLabel, phoneValue);
}
} /**
* 当用户选择某一个联系人的某一个属性时会调用该方法
*
* @param person 选择的联系人
* @param property 选择的属性
* @param identifier 属性对应的标识符
*/
- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker didSelectPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier
{
}

二.AddressBook的使用

  • 使用步骤

    • 获取用户的授权

      • 获取授权状态
      • 如果用户是未决定状态,则请求授权
    • 获取联系人信息
      • 获取授权状态
      • 如果是已经授权,则获取联系人信息
      • 创建通信录对象
      • 获取通信录中所有的联系人
      • 遍历所有的联系人,获取联系人信息
  • 获取用户授权的代码实现
    • 注意:通常在应用启动时就询问用户授权
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    // 1.获取授权状态
ABAuthorizationStatus status = ABAddressBookGetAuthorizationStatus(); // 2.判断授权状态
if (status == kABAuthorizationStatusNotDetermined) {
// 2.1.创建通信录对象
ABAddressBookRef addressBook = ABAddressBookCreate(); // 2.2.请求授权
ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) {
if (granted) {
NSLog(@"授权成功");
} else {
NSLog(@"授权失败");
}
});
} return YES;
}
  • 获取联系人信息
     // 1.获取授权状态
ABAuthorizationStatus status = ABAddressBookGetAuthorizationStatus(); // 2.如果是没有授权,则直接返回
if (status != kABAuthorizationStatusAuthorized) return; // 3.获取联系人
// 3.1.创建通信录对象
ABAddressBookRef addressBook = ABAddressBookCreate(); // 3.2.从通信录对象中获取所有的联系人
CFArrayRef peopleArray = ABAddressBookCopyArrayOfAllPeople(addressBook); // 3.2.遍历所有的联系人
CFIndex peopleCount = CFArrayGetCount(peopleArray);
for (CFIndex i = ; i < peopleCount; i++) {
// 3.3.获取i位置的联系人
ABRecordRef person = CFArrayGetValueAtIndex(peopleArray, i); // 1.获取联系人的姓名
CFStringRef firstName = ABRecordCopyValue(person, kABPersonFirstNameProperty);
CFStringRef lastName = ABRecordCopyValue(person, kABPersonLastNameProperty);
NSLog(@"%@ %@", firstName, lastName); // 2.获取电话号码
ABMultiValueRef phones = ABRecordCopyValue(person, kABPersonPhoneProperty);
CFIndex phoneCount = ABMultiValueGetCount(phones);
for (CFIndex i = ; i < phoneCount; i++) {
// 2.1.获取电话号码
CFStringRef phoneLabel = ABMultiValueCopyLabelAtIndex(phones, i);
CFStringRef phoneValue = ABMultiValueCopyValueAtIndex(phones, i);
NSLog(@"%@ %@", phoneLabel, phoneValue);
}
}

iOS9之后获取通信录

一.ContactsUI的使用

  • 使用步骤

    • 创建选择联系人控制器
    • 设置代理
    • 实现代理方法(在代理方法中拿到用户选择的联系人)
    • 弹出控制器
  • 代码实现
 #pragma mark - <CNContactPickerViewController代理方法>
/**
* 当选中一个联系人时,会执行该方法
*
* @param picker 选择联系人的控制器
* @param contact 选择的联系人
*/
- (void)contactPicker:(CNContactPickerViewController *)picker didSelectContact:(CNContact *)contact
{
// 1.获取联系人的姓名
NSString *firstName = contact.givenName;
NSString *lastName = contact.familyName;
NSLog(@"%@ %@", firstName, lastName); // 2.获取联系人的电话号码
NSArray *phoneNumers = contact.phoneNumbers;
for (CNLabeledValue *labelValue in phoneNumers) {
CNPhoneNumber *phoneNumber = labelValue.value;
NSString *phoneValue = phoneNumber.stringValue;
NSString *phoneLabel = labelValue.label;
NSLog(@"%@ %@", phoneValue, phoneLabel);
}
} /**
* 当选中某一个联系人的某一个属性时,会执行该方法
*
* @param contactProperty 选中的联系人属性
*/
- (void)contactPicker:(CNContactPickerViewController *)picker didSelectContactProperty:(CNContactProperty *)contactProperty{}

二.Contacts的使用

  • 使用步骤

    • 获取用户的授权

      • 获取授权状态
      • 如果用户是未决定状态,则请求授权
    • 获取联系人信息
      • 获取授权状态
      • 如果是已经授权,则获取联系人信息
      • 创建通信录对象
      • 创建联系人请求对象
      • 遍历所有的联系人,获取联系人信息
  • 获取用户授权的代码实现
    • 注意:通常在应用启动时就询问用户授权
  • 授权的代码实现
 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

     // 1.获取授权状态
CNAuthorizationStatus status = [CNContactStore authorizationStatusForEntityType:CNEntityTypeContacts]; // 2.如果是未决定状态,则请求授权
if (status == CNAuthorizationStatusNotDetermined) {
// 3.创建CNContactStore对象
CNContactStore *contactStore = [[CNContactStore alloc] init]; // 4.请求授权
[contactStore requestAccessForEntityType:CNEntityTypeContacts completionHandler:^(BOOL granted, NSError * _Nullable error) {
if (granted) {
NSLog(@"授权成功");
} else {
NSLog(@"授权失败:%@", error);
}
}];
} return YES;
}
  • 获取联系人
     // 1.获取授权状态
CNAuthorizationStatus status = [CNContactStore authorizationStatusForEntityType:CNEntityTypeContacts]; // 2.如果是没有授权,则直接返回
if (status != CNAuthorizationStatusAuthorized) return; // 3.创建通信录的对象
CNContactStore *contactStore = [[CNContactStore alloc] init]; // 4.创建联系人请求对象
NSArray *keys = @[CNContactGivenNameKey, CNContactFamilyNameKey, CNContactPhoneNumbersKey];
CNContactFetchRequest *request = [[CNContactFetchRequest alloc] initWithKeysToFetch:keys]; // 5.遍历所有的联系人
[contactStore enumerateContactsWithFetchRequest:request error:nil usingBlock:^(CNContact * _Nonnull contact, BOOL * _Nonnull stop) {
// stop是决定是否要停止
// 1.获取姓名
NSString *firstname = contact.givenName;
NSString *lastname = contact.familyName;
NSLog(@"%@ %@", firstname, lastname); // 2.获取电话号码
NSArray *phones = contact.phoneNumbers; // 3.遍历电话号码
for (CNLabeledValue *labelValue in phones) {
CNPhoneNumber *phoneNumber = labelValue.value;
NSLog(@"%@ %@", phoneNumber.stringValue, labelValue.label);
}
}];
 

       

ios开发 通讯录的更多相关文章

  1. iOS开发-通讯录有界面

    // //  ViewController.m //  06-通讯录(有界面) // #import "ViewController.h" #import <AddressB ...

  2. iOS开发系列--通讯录、蓝牙、内购、GameCenter、iCloud、Passbook系统服务开发汇总

    --系统应用与系统服务 iOS开发过程中有时候难免会使用iOS内置的一些应用软件和服务,例如QQ通讯录.微信电话本会使用iOS的通讯录,一些第三方软件会在应用内发送短信等.今天将和大家一起学习如何使用 ...

  3. iOS开发系列通讯录、蓝牙、内购、GameCenter、iCloud、Passbook系统服务开

    --系统应用与系统服务 iOS开发过程中有时候难免会使用iOS内置的一些应用软件和服务,例如QQ通讯录.微信电话本会使用iOS的通讯录,一些第三方软件会在应用内发送短信等.今天将和大家一起学习如何使用 ...

  4. IOS开发笔记 IOS如何访问通讯录

    IOS开发笔记  IOS如何访问通讯录 其实我是反对这类的需求,你说你读我的隐私,我肯定不愿意的. 幸好ios6.0 以后给了个权限控制.当打开app的时候你可以选择拒绝. 实现方法: [plain] ...

  5. IOS开发中使用CNContact\CNMutableContact 对通讯录增删改查

    IOS开发中使用CNContact\CNMutableContact 对通讯录增删改查 首先当然是把CNcontact包含在工程中: @import Contacts; 1.下面是增加联系人的程序段: ...

  6. iOS开发系列--通讯录、蓝牙、

    iOS开发过程中有时候难免会使用iOS内置的一些应用软件和服务,例如QQ通讯录.微信电话本会使用iOS的通讯录,一些第三方软件会在应用内发送短信等.今天将和大家一起学习如何使用系统应用.使用系统服务: ...

  7. iOS开发系列文章(持续更新……)

    iOS开发系列的文章,内容循序渐进,包含C语言.ObjC.iOS开发以及日后要写的游戏开发和Swift编程几部分内容.文章会持续更新,希望大家多多关注,如果文章对你有帮助请点赞支持,多谢! 为了方便大 ...

  8. iOS开发 Xcode8中遇到的问题及改动

      iOS开发 Xcode8中遇到的问题及改动 新版本发布总会有很多坑,也会有很多改动. 一个一个填吧... 一.遇到的问题 1.权限以及相关设置 iOS10系统下调用系统相册.相机功能,或者苹果健康 ...

  9. iOS开发系列--UITableView全面解析

    --UIKit之UITableView 概述 在iOS开发中UITableView可以说是使用最广泛的控件,我们平时使用的软件中到处都可以看到它的影子,类似于微信.QQ.新浪微博等软件基本上随处都是U ...

随机推荐

  1. Kafka/Metaq设计思想学习笔记 转

    转载自: http://my.oschina.net/geecoodeer/blog/194829 本文没有特意区分它们之间的区别,仅仅是列出其中笔者认为好的设计思想,供后续设计参考. 目前笔者并没有 ...

  2. NodeJs http.get 方法请求时间过长问题处理!

    NodeJs 获取网页内容 http.get 默认请求超时过长了,程序要卡死好一会. 根据网上资料现改造了一个带超时设置的获取网页内容方法. 主要方法使用 setTimeout 来超时, 代码如下: ...

  3. Token验证失败

    Token验证失败 微信 微信公众平台开发 Token校验失败 URL Token原文 http://www.cnblogs.com/txw1958/p/token-verify.html Token ...

  4. HAProxy安装配置详解

    简介 HAProxy提供高可用性.负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费.快速并且可靠的一种解决方案. HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要 ...

  5. flash 自定义右键功能

    使用过程可能遇到的问题: MouseEvent.RIGHT_CLICK TypeError: Error #2007: 参数 type 不能为空. 首先在项目中设置编译参数. 如果是as项目,则在项目 ...

  6. Spring AOP 完成日志记录

    Spring AOP 完成日志记录 http://hotstrong.iteye.com/blog/1330046

  7. 网站整合Ucenter详细流程

    最近公司项目要用到SNS,在具体采取解决方案上面由于项目由一实力较强的外包公司做,所以没有采用商业解决方案.不过本人一直比较看好康盛的产 品,因为被外派到外包公司去负责项目,尽管以前用的SNS也在不少 ...

  8. json(http://www.cnblogs.com/lanxuezaipiao/archive/2013/05/24/3096437.html)

    http://www.cnblogs.com/lanxuezaipiao/archive/2013/05/24/3096437.html

  9. C#EXCEL 操作类--C#ExcelHelper操作类

    主要功能如下1.导出Excel文件,自动返回可下载的文件流 2.导出Excel文件,转换为可读模式3.导出Excel文件,并自定义文件名4.将数据导出至Excel文件5.将指定的集合数据导出至Exce ...

  10. opencv透视变换

    关于透视投影的几何知识,以及求解方法,可以参考 http://media.cs.tsinghua.edu.cn/~ahz/digitalimageprocess/chapter06/chapt06_a ...