iOS通讯录&第三方框架介绍
来源:互联网 发布:黑泽朋世 知乎 编辑:程序博客网 时间:2024/05/21 06:58
首先很久没有更博客,先跟同学们说声抱歉!那么今天我们的主题是讲如何访问系统通讯录以及第三方的一个通讯录框架的介绍,那么废话不多说!直接上代码!
iOS中,有2个框架可以访问用户的通讯录
AddressBookUI.framework
提供了联系人列表界面、联系人详情界面、添加联系人界面等
一般用于选择联系人
AddressBook.framework
纯C语言的API,仅仅获得联系人数据
没有提供UI界面展示、需要自己搭建联系人展示界面
里面的数据类型大部分基于Core Foundation框架、使用起来极其蛋疼
从iOS6开始、需要得到用户的授权才能访问通讯录、因此在使用之前、查看用户是否已经授权(AddressBook.framework)
从iOS8默认就有联系人直接读取
//
// ZZViewController.h
// 01-私人通讯录(一)
//
// Created by 周昭 on 2017/3/8.
// Copyright © 2017年 YYSP. All rights reserved.
//
#import <UIKit/UIKit.h>
@interface ZZViewController : UIViewController
@end
//
// ZZViewController.m
// 01-私人通讯录(一)
//
// Created by 周昭 on 2017/3/8.
// Copyright © 2017年 YYSP. All rights reserved.
//
#import "ZZViewController.h"
#import <AddressBookUI/AddressBookUI.h>
@interface ZZViewController ()<ABPeoplePickerNavigationControllerDelegate>
@end
@implementation ZZViewController
/*
// 第三方框架 RHAddressBook(通讯录的第三方框架)更加面向对象
// include/ recursive 递归查找
*/
- (void)viewDidLoad {
[superviewDidLoad];
// 1.授权
// [self getStatus];
}
- (void)getStatus
{
#warning - 这个不应该在某个控制器的时候获取授权应该在应用打开的时候就获取写在AppDelegate中
/*
ABAddressBookGetAuthorizationStatus() 授权状态
{
kABAuthorizationStatusNotDetermined = 0, // 未决定
kABAuthorizationStatusRestricted, // 特殊原因不能访问用户的通讯录
kABAuthorizationStatusDenied, // 拒绝访问
kABAuthorizationStatusAuthorized // 已经授权
}
*/
// 1.0 获取用户的授权状态
ABAuthorizationStatus status =ABAddressBookGetAuthorizationStatus();
// 2.0 如果授权是未决定的,则请求授权
// if (status == kABAuthorizationStatusNotDetermined) {
// // 2.1 获取通讯录对象
// ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, NULL);
//
// // 2.2 请求授权
// ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) {
// if (granted) {
// NSLog(@"用户授权成功");
// } else {
// NSLog(@"用户授权失败");
// }
// });
// }
// 上面的代码转换成一句话如果授权不成功直接返回
if (status !=kABAuthorizationStatusNotDetermined)return;
//
// 授权成功继续
}
/**
* 点击界面跳转带UI的通讯录界面
*/
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
ABPeoplePickerNavigationController *ppnc = [[ABPeoplePickerNavigationControlleralloc] init];
ppnc.peoplePickerDelegate =self;
[selfpresentViewController:ppncanimated:YEScompletion:nil];
}
#pragma mark - ABPeoplePickerNavigationControllerDelegate代理方法
/**
* 选中某一个联系人的时候会调用该方法
* @param person 选中的联系人
*/
- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker didSelectPerson:(ABRecordRef)person
{
#pragma mark - 验证来了这个方法没有
NSLog(@"%s",__func__);
#warning - 这里极度需要同学们注意
/*
1. CoreFoundation --> Foundation 桥接(以及内存泄口一定要注意)
2. Product --> Profile --> instrument --> leeks 检测内存泄漏
*/
// 1.获取联系人姓名
CFStringRef firstName =ABRecordCopyValue(person,kABPersonFirstNameProperty);
CFStringRef lastName =ABRecordCopyValue(person,kABPersonLastNameProperty);
/*
__bridge NSString * : 将对象所有权给Foundation框架一份,但是本身没有释放
__bridge_transfer NSString * : 将对象所有权交给Foundation框架,并且自身释放掉对象
CFBridgingRelease 一种写法一种方式
copy\creat 的都需要释放
方法过期他会实现2个方法走俩个方法
*/
NSString *first = (__bridge_transferNSString *)(firstName);
NSString *last = (__bridgeNSString *)(lastName);
NSLog(@"%@---%@",first, last);
CFRelease(lastName);
// 2.获取联系人电话
ABMultiValueRef phones =ABRecordCopyValue(person,kABPersonPhoneProperty);
CFIndex phoneCount =ABMultiValueGetCount(phones);
for (CFIndex i =0; i < phoneCount; i++) {
NSString *phoneLabel =CFBridgingRelease(ABMultiValueCopyLabelAtIndex(phones, i));
NSString *phoneValue =CFBridgingRelease(ABMultiValueCopyValueAtIndex(phones, i));
NSLog(@"%@ -- %@", phoneLabel, phoneValue);
}
// 3.释放对象
CFRelease(phones);
}
#warning - 如果想实现了上面的方法那么下面的方法就不会走这一点要注意(同学们自己实践)
/**
* 选中某一个联系人的某一个属性的时候会调用该方法
* @param person 选中的联系人
* @param property 选中的属性
* @param identifier 属性对应的标识
*/
- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker didSelectPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier
{
NSLog(@"%s",__func__);
}
/*
#pragma mark - iOS7的方法那么注意适配的问题
- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person
{
return NO;
}
- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier
{
return NO;
}
#warning - iOS7要实现点击取消这个方法否则会崩掉
- (void)peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)peoplePicker
{
[peoplePicker dismissViewControllerAnimated:YES completion:nil];
}
*/
@end
- iOS通讯录&第三方框架介绍
- 第三方框架介绍
- iOS第三方框架
- ios 第三方框架
- iOS 第三方框架
- iOS第三方框架
- 集成通讯录(第三方框架RHAddressBook)
- iOS开发之音频解析第三方框架介绍
- ios 关于常用的一些第三方框架的介绍
- iOS开发之音频解析第三方框架介绍
- iOS 第三方框架-Masonry介绍与使用实践
- iOS 第三方框架-SVProgressHUD的简单介绍
- iOS 第三方优质库\框架\项目介绍
- IOS 第三方框架大全
- IOS常用第三方框架
- IOS常用第三方框架
- ios常用第三方框架
- iOS第三方框架集合
- Centos更新python以及相应软件及模块的安装
- 利用Spring Interceptor 来缓存指定方法结果
- sed命令详解
- 前端开源项目周报0307
- Spring Boot + JSP(官方不推荐)
- iOS通讯录&第三方框架介绍
- 如何旋转PDF文件中的某一个页面
- 再谈java两种变量(基本类型和引用类型)(综合各路大神)
- Always On Top
- java网络编程____UDP入门小demo
- u3d美术制作规范总结
- Android反射机制(一)
- C++ 基础(五) —— 语句
- Paas SaaS