一.通信录开发

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

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

  • 在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. 网站tomcat配置

    <?xml version='1.0' encoding='utf-8'?> <!-- Licensed to the Apache Software Foundation (ASF ...

  2. Hello Dojo!(翻译)

    http://dojotoolkit.org/documentation/tutorials/1.10/hello_dojo/index.html 欢迎学习DOJO!在本教程中,你将学些到如何加载DO ...

  3. CSAPP(前言)

    很久之前就听过有过CSAPP这本书的传闻了,今天终于决定上手这本神作:既然是神作,就要仔细拜读一下,今天看了一下前言部分还真的令人耳目一新,单单是前言部分就让我学习到几个新的知识点: 1.c和Java ...

  4. gradle大体内容

    buildscript { repositories { mavenCentral() } dependencies { classpath 'com.android.tools.build:grad ...

  5. DirectBuffer

    1.如何分配,分配是哪里的内存 ByteBuffer.allocateDirect()来分配(ByteBuffer.allocate()分配堆内内存),分配的是非Heap(堆外)的内存,不排除操作系统 ...

  6. Linux下date命令,格式化输出,时间设置

    date命令的帮助信息 [root@localhost source]# date --help用法:date [选项]... [+格式] 或:date [-u|--utc|--universal] ...

  7. nginx/Windows-1.9.3启动脚本

    启动nginx.bat @echo off D: cd D:\Program Files\nginx-1.9.3 tasklist | findstr /i "nginx.exe" ...

  8. Extjs 4.2 Grid增删改及后台交互(Java)

    上次发了Easyui Datagrid的增删改查的使用学习记录后一直想整理下基于Extjs4.2的Grid学习使用记录.苦于抽不出时间,一直拖到现在.不得不说,Extjs确实很强大,新版的Neptun ...

  9. Node.js初探之hello world

    昨天公司内部培训,主讲人王老板对Node.js评价很高,连用几个“变态”来形容,恰好今天周末,有时间来认识下Node.js,对一门新语言最好的认识,是让其输出“hello world”,今天我就利用N ...

  10. EXT学习之——Ext下拉框绑定无效的问题

    1.保证store定义是否在combobox前面 2.有没写  .load 3.有没赋值  xxstore:xxstore 具体看详细步骤 http://www.cnblogs.com/wdw3121 ...