获取通讯录信息在iOS8.0和9.0的区别

这篇文章主要介绍在iOS8.0和iOS9.0有界面和无界面 获取通讯录信息的方法.下面我们逐个介绍  首先我们要明确 无论是 iOS8.0和iOS9.0在有界面的情况下都不需要授权

1.iOS8.0 有界面的操作  需要导入 AddressBookUI 静态库 遵循 ABPeoplePickerNavigationControllerDelegate协议

需要注意的是我们在不用桥接的情况下要注意内存泄露问题

#import "ViewController.h"

#import <AddressBookUI/AddressBookUI.h>

@interface ViewController () <ABPeoplePickerNavigationControllerDelegate>

@end

@implementation ViewController

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event

{

//创建控制器

//弹出控制器

ABPeoplePickerNavigationController *picker  = [[ABPeoplePickerNavigationController alloc]init];

//设置代理

picker.peoplePickerDelegate = self;

//展示界面

[self presentViewController:picker animated:YES completion:nil];

}

//选择中  一个人的信息就会调用

//参数1  控制器  参数2 选择的person的信息

- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker didSelectPerson:(ABRecordRef)person

{

//目标: 获取联系人信息

//coreFountion

//指针  Record 记录  数据库   字段   列   记录  行

//需求 : name  电话号码

//C语言API特征    实现任何功能都是  调用一个函数  参数  返回值  输入和输出

// name

CFStringRef strfirst =   ABRecordCopyValue(person, kABPersonFirstNameProperty);

CFStringRef strlast =   ABRecordCopyValue(person, kABPersonLastNameProperty);

NSString *strF = (__bridge_transfer NSString *)(strfirst);

NSString *strL = (__bridge_transfer NSString *)(strlast);

NSLog(@"%@  %@",strF,strL);

//电话号码  ABMultiValueRef 封装一个保存了很多电话的一个类型

ABMultiValueRef  multiValues =   ABRecordCopyValue(person, kABPersonPhoneProperty);

//函数 来做

CFIndex index = ABMultiValueGetCount(multiValues);

for (CFIndex i = 0; i < index; i++) {

CFStringRef strPhone  =    ABMultiValueCopyValueAtIndex(multiValues, i);

NSString *phoneStr = (__bridge_transfer  NSString *)(strPhone);

NSLog(@"%@",phoneStr);

}

if (multiValues != NULL) {

CFRelease(multiValues);

}

//内存  静态分析工具

//C语言 API  CoreFoundation  create  copy  等 获取 的对象都需要释放 -> CFRelease

//桥接

//__bridge  默认桥接

//__bridge_transfer  桥接 coreF  -> ocF   转让对象的所有权

//__bridge_retained  桥接 ocF  -> coreF   转让对象的所有权

}

/*备份*/ 在没有使用桥接的情况下注意内存泄露问题

- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker didSelectPerson:(ABRecordRef)person

{

//目标: 获取联系人信息

//coreFountion

//指针  Record 记录  数据库   字段   列   记录  行

//需求 : name  电话号码

//C语言API特征    实现任何功能都是  调用一个函数  参数  返回值  输入和输出

// name

CFStringRef strfirst =   ABRecordCopyValue(person, kABPersonFirstNameProperty);

CFStringRef strlast =   ABRecordCopyValue(person, kABPersonLastNameProperty);

NSString *strF = (__bridge NSString *)(strfirst);

NSString *strL = (__bridge NSString *)(strlast);

NSLog(@"%@  %@",strF,strL);

if (strfirst != NULL) {

CFRelease(strfirst);

}

if (strlast != NULL)

{

CFRelease(strlast);

}

//电话号码  ABMultiValueRef 封装一个保存了很多电话的一个类型

ABMultiValueRef  multiValues =   ABRecordCopyValue(person, kABPersonPhoneProperty);

//函数 来做

CFIndex index = ABMultiValueGetCount(multiValues);

for (CFIndex i = 0; i < index; i++) {

CFStringRef strPhone  =    ABMultiValueCopyValueAtIndex(multiValues, i);

NSString *phoneStr = (__bridge_transfer  NSString *)(strPhone);

NSLog(@"%@",phoneStr);

if (strPhone != NULL) {

CFRelease(strPhone);

}

}

if (multiValues != NULL) {

CFRelease(multiValues);

}

//内存  静态分析工具

//C语言 API  CoreFoundation  create  copy  等 获取 的对象都需要释放 -> CFRelease

//桥接

//__bridge  默认桥接

//__bridge_transfer  桥接 coreF  -> ocF   转让对象的所有权

//__bridge_retained  桥接 ocF  -> coreF   转让对象的所有权

}

//选择中  一个人的信息就会调用  必须是选择属性 才会调用

//注意点  如果实现 上面 peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker didSelectPerson:(ABRecordRef)person  当前方法不执行 界面不显示

- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker didSelectPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier

{

NSLog(@"property %zd",property);

}

//点击取消了 就会调用

- (void)peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)peoplePicker

{

NSLog(@"peoplePickerNavigationControllerDidCancel");

}

2.iOS8.0 无界面的操作  需要导入 AddressBook 静态库  需要授权

#import "ViewController.h"

#import <AddressBook/AddressBook.h>

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {

[super viewDidLoad];

//获取用户的授权  旧的 知识

/*

kABAuthorizationStatusNotDetermined = 0,    // deprecated, use CNAuthorizationStatusNotDetermined

kABAuthorizationStatusRestricted,           // deprecated, use CNAuthorizationStatusRestricted

kABAuthorizationStatusDenied,               // deprecated, use CNAuthorizationStatusDenied

kABAuthorizationStatusAuthorized            // 已经授权

*/

ABAuthorizationStatus status = ABAddressBookGetAuthorizationStatus();

if (status ==  kABAuthorizationStatusNotDetermined) {

//参数1 通讯录对象   参数2block 回调

ABAddressBookRef book =   ABAddressBookCreateWithOptions(NULL, NULL);

//申请授权

ABAddressBookRequestAccessWithCompletion(book, ^(bool granted, CFErrorRef error) {

if (granted) {

NSLog(@"授权成功!");

}else{

NSLog(@"授权失败!");

}

});

}

}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event

{

//获取联系人 信息

//name

ABAddressBookRef book =   ABAddressBookCreateWithOptions(NULL, NULL);

CFArrayRef  allpeople =  ABAddressBookCopyArrayOfAllPeople(book);

CFIndex count =  CFArrayGetCount(allpeople);

for (CFIndex i = 0; i <count ; i++) {

ABRecordRef record =   CFArrayGetValueAtIndex(allpeople, i);

CFStringRef strFirst =   ABRecordCopyValue(record, kABPersonFirstNameProperty);

NSString *str =  (__bridge_transfer NSString *)strFirst;

NSLog(@"%@",str);

//电话号码

ABMultiValueRef multivalue =  ABRecordCopyValue(record, kABPersonPhoneProperty);

for (CFIndex i = 0; i < ABMultiValueGetCount(multivalue); i++) {

CFStringRef phoneStr =   ABMultiValueCopyValueAtIndex(multivalue, i);

NSString *phone = (__bridge_transfer  NSString *)(phoneStr);

NSLog(@"%@",phone);

}

}

}

3.iOS9.0 有界面的操作  需要导入 ContactsUI 静态库

#import "ViewController.h"

#import <ContactsUI/ContactsUI.h>

@interface ViewController ()<CNContactPickerDelegate>

@end

@implementation ViewController

- (void)viewDidLoad {

[super viewDidLoad];

}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event

{

//不需要授权

//1.创建通讯录控制器

CNContactPickerViewController *picker = [[CNContactPickerViewController alloc]init];

//2.设置代理  拿到数据本身

picker.delegate = self;

//3.展示

[self presentViewController:picker animated:YES completion:nil];

}

- (void)contactPickerDidCancel:(CNContactPickerViewController *)picker;

{

NSLog(@"contactPickerDidCancel");

}

//选择一个联系人信息

- (void)contactPicker:(CNContactPickerViewController *)picker didSelectContact:(CNContact *)contact;

{

NSLog(@"didSelectContact");

//NSLog(@"%@",contact.givenName);

NSArray *allArray =   contact.phoneNumbers;

for (CNLabeledValue * labeledValue in allArray) {

CNPhoneNumber *num = labeledValue.value;

NSLog(@"num = %@",num.stringValue);

NSLog(@"===%@ ===%@",labeledValue.value,labeledValue.label);

}

}

//选择一个联系人属性 具体信息

- (void)contactPicker:(CNContactPickerViewController *)picker didSelectContactProperty:(CNContactProperty *)contactProperty;

{

NSLog(@"didSelectContactProperty");

}

4.iOS9.0 无界面的操作  需要导入 Contacts 静态库 需要授权

#import "ViewController.h"

#import <Contacts/Contacts.h>

@interface ViewController ()

@property (nonatomic, strong) CNContactStore *store;

@end

@implementation ViewController

- (void)viewDidLoad {

[super viewDidLoad];

//授权

CNAuthorizationStatus status = [CNContactStore authorizationStatusForEntityType:CNEntityTypeContacts];

//如果没有授权过需要请求用户的授权

CNContactStore *store = [[CNContactStore alloc]init];

self.store = store;

if (status == CNAuthorizationStatusNotDetermined) {

//请求授权

[store requestAccessForEntityType:CNEntityTypeContacts completionHandler:^(BOOL granted, NSError * _Nullable error) {

if (granted) {

NSLog(@"授权成功!");

}else{

NSLog(@"授权失败!");

}

}];

}

}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event

{

//name  phone

CNContactFetchRequest *request = [[CNContactFetchRequest alloc]initWithKeysToFetch:@[CNContactGivenNameKey,CNContactPhoneNumbersKey]];

//参数1  封装查询请求

[self.store enumerateContactsWithFetchRequest: request error:nil usingBlock:^(CNContact * _Nonnull contact, BOOL * _Nonnull stop) {

//返回的数据 CNContact

NSLog(@"%@",contact.givenName);

NSLog(@"%@",contact.phoneNumbers);

}];

}

时间: 2024-09-30 15:37:23

获取通讯录信息在iOS8.0和9.0的区别的相关文章

React Native之获取通讯录信息并实现类通讯录列表(ios android)

React Native之获取通讯录信息并实现类通讯录列表(ios android) 一,需求分析 1,获取通讯录信息,筛选出通讯录里有多少好友在使用某个应用. 2,获取通讯录信息,实现类通讯录,可拨打电话 发短信等. 二,技术介绍与配置 2.1 技术介绍 1,react-native-contacts地址:https://www.npmjs.com/package/react-native-contacts 2,下载安装:npm install react-native-contacts --

获取ios通讯录信息

包含相应地库之后直接调用 #import <AddressBook/AddressBook.h> #import <AddressBookUI/AddressBookUI.h> -(void)readAllPeoples { //定义通讯录名字为addressbook ABAddressBookRef tmpAddressBook = nil; //根据系统版本不同,调用不同方法获取通讯录 if ([[UIDevice currentDevice].systemVersion fl

iOS通过app读取通讯录信息(整理)

iOS通过app读取通讯录信息,读取通讯录信息时需要加载AddressBookUI 和AddressBook两个包,并且引入头文件 #import <AddressBook/AddressBook.h> #import <AddressBookUI/AddressBookUI.h> 具体实现如下: -(void)readAllPeoples { //定义通讯录名字为addressbook ABAddressBookRef tmpAddressBook = nil; //根据系统版本

Android手机获取通讯录联系人信息及短信广播实现

现在越来越多的android应用在注册时都要用到手机号码,通过获取手机验证码来完成注册.也有不少应用提供了手机通讯录备份功能,获得你的允许后把你的通讯录中的手机号码保存到服务器中,你要的时候又可以down下来,比如微信,QQ等就有这们的功能.那我们怎么样获取用户通讯录中的手机号码呢?Android已经为我们做好了准备: ---------------------------------获取通讯录联系人信息----------------------------------------------

Android逆向之旅---静态方式破解微信获取聊天记录和通讯录信息

一.猜想数据存放路径 微信现在是老少皆宜,大街小巷都在使用,已经替代了传统的短信聊天方式了,只要涉及到聊天就肯定有隐私消息,那么本文就来讲解如何获取微信的聊天记录以及通讯录信息. 首先我们在没有网络的时候,打开微信同样可以查看聊天记录,说明微信会把聊天记录保存到本地,那么这么多信息肯定会保存在数据库中,所以我们可以去查看微信的databases目录看看内容: 可惜的是,我们在这个里面并没有发现一些有用的数据,所以这时候就了解到了微信因为把重要信息的数据库存在其他目录下面,我们可以直接把微信的整个

iOS读取通讯录获取好友通讯录信息[名字(姓+名字),手机号码(多个号码)等]

一.创建通讯录对象 self.addressBook=ABAddressBookCreateWithOptions(NULL, NULL); //请求访问用户通讯录,注意无论成功与否block都会调用 ABAddressBookRequestAccessWithCompletion(self.addressBook, ^(bool granted, CFErrorRef error) { if (!granted) { NSLog(@"未获得通讯录访问权限!"); } }); ABPe

spring cloud云架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)

上一篇我根据框架中OAuth2.0的使用总结,画了SSO单点登录之OAuth2.0 登出流程,今天我们看一下根据用户token获取yoghurt信息的流程: Java代码   /** * 根据token获取用户信息 * @param accessToken * @return * @throws Exception */ @RequestMapping(value = "/user/token/{accesstoken}", method = RequestMethod.GET) pu

PHP微信OAuth2.0网页授权,获取用户信息代码类封装demo(二)

一.这个文件微信授权使用的是OAuth2.0授权的方式.主要有以下简略步骤: 第一步:判断有没有code,有code去第三步,没有code去第二步 第二步:用户同意授权,获取code 第三步:通过code换取网页授权access_token 第四步:使用access_token获取用户信息 二.代码GetWxUser.php 1 <?php 2 /** 3 * 获取微信用户信息 4 * @author: Lucky hypo 5 */ 6 class GetWxUser{ 7 private $

.net core 2.0 mvc 获取配置信息

mvc_core_config html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,lege