ios开发 通讯录
一.通信录开发
- 通信录开发主要是获取用户手机中的联系人
- 通过获取用户的通信录,可以在应用中添加好友等
二.如何访问用户的通讯录
- 在iOS9之前,有2个框架可以访问用户的通讯录
- 目前需要适配iOS8,所有也必须进行学习
- AddressBookUI.framework
- 提供了联系人列表界面、联系人详情界面、添加联系人界面等
- 一般用于选择联系人
- AddressBook.framework
- 纯C语言的API,仅仅是获得联系人数据
- 没有提供UI界面展示,需要自己搭建联系人展示界面
- 里面的数据类型大部分基于Core Foundation框架,使用起来极其蛋疼
- 在iOS9开始,也有2个框架可以访问用户的通讯录
- ContactsUI.framework
- 对应AddressBookUI.framework
- Contacts.framework
- 对应AddressBook.framework
- ContactsUI.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开发 通讯录的更多相关文章
- iOS开发-通讯录有界面
// // ViewController.m // 06-通讯录(有界面) // #import "ViewController.h" #import <AddressB ...
- iOS开发系列--通讯录、蓝牙、内购、GameCenter、iCloud、Passbook系统服务开发汇总
--系统应用与系统服务 iOS开发过程中有时候难免会使用iOS内置的一些应用软件和服务,例如QQ通讯录.微信电话本会使用iOS的通讯录,一些第三方软件会在应用内发送短信等.今天将和大家一起学习如何使用 ...
- iOS开发系列通讯录、蓝牙、内购、GameCenter、iCloud、Passbook系统服务开
--系统应用与系统服务 iOS开发过程中有时候难免会使用iOS内置的一些应用软件和服务,例如QQ通讯录.微信电话本会使用iOS的通讯录,一些第三方软件会在应用内发送短信等.今天将和大家一起学习如何使用 ...
- IOS开发笔记 IOS如何访问通讯录
IOS开发笔记 IOS如何访问通讯录 其实我是反对这类的需求,你说你读我的隐私,我肯定不愿意的. 幸好ios6.0 以后给了个权限控制.当打开app的时候你可以选择拒绝. 实现方法: [plain] ...
- IOS开发中使用CNContact\CNMutableContact 对通讯录增删改查
IOS开发中使用CNContact\CNMutableContact 对通讯录增删改查 首先当然是把CNcontact包含在工程中: @import Contacts; 1.下面是增加联系人的程序段: ...
- iOS开发系列--通讯录、蓝牙、
iOS开发过程中有时候难免会使用iOS内置的一些应用软件和服务,例如QQ通讯录.微信电话本会使用iOS的通讯录,一些第三方软件会在应用内发送短信等.今天将和大家一起学习如何使用系统应用.使用系统服务: ...
- iOS开发系列文章(持续更新……)
iOS开发系列的文章,内容循序渐进,包含C语言.ObjC.iOS开发以及日后要写的游戏开发和Swift编程几部分内容.文章会持续更新,希望大家多多关注,如果文章对你有帮助请点赞支持,多谢! 为了方便大 ...
- iOS开发 Xcode8中遇到的问题及改动
iOS开发 Xcode8中遇到的问题及改动 新版本发布总会有很多坑,也会有很多改动. 一个一个填吧... 一.遇到的问题 1.权限以及相关设置 iOS10系统下调用系统相册.相机功能,或者苹果健康 ...
- iOS开发系列--UITableView全面解析
--UIKit之UITableView 概述 在iOS开发中UITableView可以说是使用最广泛的控件,我们平时使用的软件中到处都可以看到它的影子,类似于微信.QQ.新浪微博等软件基本上随处都是U ...
随机推荐
- java 里面的string 和byte[] 怎么互转
public class TestBytes { private static String FORMAT = "UTF-8"; public static void main(S ...
- [驱动]内核添加USB转串口驱动支持
转自:http://blog.csdn.net/gatieme/article/details/49491325 目录 1. 问题 2. 驱动源码 3. 内核配置 4. 编译内核和模块驱动 5. 加载 ...
- 使用 7za.exe 打包文件
7za.exe 下载地址:http://www.7-zip.org/a/7za920.zip 7za <command> [<switch>...] <base_arch ...
- bootstrap-面板、modal
面板: <!-- panel 面板 panel-heading 面板头部 panel-title 面板标题样式 panel-body 面板内容 --> <div class=&quo ...
- 使用 Jmeter 做 Web 接口测试
接口测试概述 定义 API testing is a type of software testing that involves testing application programming in ...
- oracle start with connect by prior 递归查询
Oracle中的select语句可以用start with...connect by prior子句实现递归查询,connect by 是结构化查询中用到的, 其基本语法是: select ... f ...
- CPA
CPA.CPS.CPM.CPT.CPC 是什么 网络营销之所以越来越受到重视一个主要的原因就是因为“精准”.相比较传统媒体的陈旧广告形式,网络营销能为广告主带来更为确切的效果与回报,更有传统媒体所没有 ...
- Codeforces 721D [贪心]
/* 不要低头,不要放弃,不要气馁,不要慌张. 题意: 给一列数a,可以进行k次操作,每次操作可以选取任意一个数加x或者减x,x是固定的数.求如何才能使得这个数列所有数乘积最小. 思路: 贪心...讨 ...
- C#_GDI+详细教程(图形图像编程基础)
第7章 C#图形图像编程基础 本章主要介绍使用C#进行图形图像编程基础,其中包括GDI+绘图基础.C#图像处理基础以及简单的图像处理技术. 7.1 GDI+绘图基础 编写图形程序时需要使用GDI( ...
- WMI使用
WMI Administrative Tools: http://www.microsoft.com/en-us/download/details.aspx?id=24045 WMI Administ ...