一.通信录开发

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

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

  • 在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. 27个知名企业品牌VI视觉识别系统规范手册

    Apple公司视觉设计规范 微软公司VI视觉系统 星巴克企业视觉规范手册 DELL品牌VI视觉手册 MTRADING品牌视觉规范 KFC视觉设计规范手册 麦当劳视觉规范 LEGO乐高玩具的品牌视觉规范 ...

  2. [Spring] - 读写分离

    使用Spring可以做到在应用层中实现数据库的读写分离. 参考文档: http://blog.csdn.net/lifuxiangcaohui/article/details/7280202 思路是使 ...

  3. CSS3 旋转代码备忘

    .Aclose { -webkit-transition-property: all; -webkit-transition-duration: .3s; -moz-transition-proper ...

  4. libpcap和WinPcap

    能从物理上访问网络上的流量后,你需要用软件把它记录下来.这里,我们探究记录.解析和分析被捕获的数据包中最常用的软件库:libpcap和WinPcap.也将介绍包括tcpdump.Wireshark等基 ...

  5. php二维数组排序方法(转自http://www.3lian.com/edu/2013/12-26/118882.html)

    一维数组排序可以使用asort.ksort等一些方法进程排序,相对来说比较简单.二维数组的排序怎么实现呢?使用array_multisort和usort可以实现 例如像下面的数组:    代码如下: ...

  6. bootstrap-面包屑和分页

    <div class="container"> <div class="row"> <ul class="breadcr ...

  7. CPA

    CPA.CPS.CPM.CPT.CPC 是什么 网络营销之所以越来越受到重视一个主要的原因就是因为“精准”.相比较传统媒体的陈旧广告形式,网络营销能为广告主带来更为确切的效果与回报,更有传统媒体所没有 ...

  8. day6_1

    一.加密模块 1.hashlib >>> data=hashlib.md5() >>> data.update(b'hello') >>> pri ...

  9. Jmeter组件1. CSV Data Set Config

    位置:Test Plan | Add | Config Element | CSV Data Set Config 意义: 脚本参数化 节省CPU跟内存(可以准备好数据文件去代替动态生成数据,节约CP ...

  10. leetcode 169

    169. Majority Element Given an array of size n, find the majority element. The majority element is t ...