iOS 获取联系人,并调用系统地址簿UI
1.加入 AddressBook库
推断授权状态
-(bool)checkAddressBookAuthorizationStatus
{
//取得授权状态
ABAuthorizationStatus authStatus =
ABAddressBookGetAuthorizationStatus();
if (authStatus !=kABAuthorizationStatusAuthorized)
{
returnNO;
}else{
returnYES;
}
}
注冊 通讯录变更通知
-(void)createChangeCallBack{
CFErrorRef error =NULL;
myAddressBook =ABAddressBookCreateWithOptions(NULL,
&error);
}
//移除通知
- (void)unregisterCallback {
ABAddressBookUnregisterExternalChangeCallback(myAddressBook,ContactsChangeCallback,nil);
}
收到变更通知后回调
void ContactsChangeCallback (ABAddressBookRef addressBook,
CFDictionaryRef info,
void *context){
),
^{
ABAddressBookUnregisterExternalChangeCallback(addressBook,ContactsChangeCallback,nil);
});
}
- (IBAction)add:(id)sender {
ABAddressBookRequestAccessWithCompletion(ABAddressBookRef addressBookRef,
^(bool granted,CFErrorRef error) {
if (granted) {
dispatch_async(dispatch_get_main_queue(), ^{
[self getContactsFromAddressBook];
});
}else {
// TODO: Show alert
}
});
}
-(void)getContactsFromAddressBook
{
CFErrorRef error =NULL;
ABAddressBookRef addressBook =ABAddressBookCreateWithOptions(NULL, &error);
ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted,CFErrorRef
error) {
if (granted) {
NSArray *allContacts = (__bridge_transferNSArray*)ABAddressBookCopyArrayOfAllPeople(addressBook);
NSMutableArray *mutableContacts = [NSMutableArrayarrayWithCapacity:allContacts.count];
;
; i<[allContactscount]; i++)
{
THContact *contact = [[THContactalloc]init];//封装通讯录的model
ABRecordRef contactPerson = (__bridgeABRecordRef)allContacts[i];
contact.recordId =ABRecordGetRecordID(contactPerson);
// Get first and last names
NSString *firstName = (__bridge_transferNSString*)ABRecordCopyValue(contactPerson,kABPersonFirstNameProperty);
NSString *lastName = (__bridge_transferNSString*)ABRecordCopyValue(contactPerson,kABPersonLastNameProperty);
NSString * midName = (__bridge_transferNSString*)ABRecordCopyValue(contactPerson,kABPersonMiddleNameProperty);
// Set Contact properties
contact.firstName = firstName;
contact.lastName = lastName;
contact.middleName = midName;
contact.name = [contactfullName];
// Get mobile number
ABMultiValueRef phonesRef =ABRecordCopyValue(contactPerson,
kABPersonPhoneProperty);
contact.phone = [selfgetMobilePhoneProperty:phonesRef];
if(phonesRef) {
CFRelease(phonesRef);
}
)
{
[mutableContactsaddObject:contact];
}
}
if(addressBook) {
CFRelease(addressBook);
}
//处理获取通讯后的逻辑
}
});
}
- (NSMutableArray *)getMobilePhoneProperty:(ABMultiValueRef)phonesRef
{
NSMutableArray * array = [NSMutableArrayarray];
; k<ABMultiValueGetCount(phonesRef);
k++)
{
//获取电话Label
// NSString * personPhoneLabel = (__bridge NSString*)ABAddressBookCopyLocalizedLabel(ABMultiValueCopyLabelAtIndex(phonesRef, k));
//获取該Label下的电话值
NSString * personPhone = (__bridgeNSString*)ABMultiValueCopyValueAtIndex(phonesRef,
k);
if (personPhone) {
[arrayaddObject:personPhone];
}
}
return array;
}
通讯录中联系人相关的应用iPhone提供了两个框架:AddressBook.framework和AddressBookUI.framework,使用这两个框架我们能够在程序中訪问并显示iPhone数据库中的联系人信息。
1.AddressBookUI显示部分
AddressBookUI中提供了和联系人显示信息相关的一些Controller,有四个:
ABPeoplePickerNavigationController:显示整个通讯录并能够选择一个联系人的信息
ABPersonViewController:显示一个详细联系人的信息
ABNewPersonViewController:添加一个新的联系人
ABUnknownPersonViewController:完好一个联系人的信息
因为当中最基本的是ABPeoplePickerNavigationController。因此就详细的介绍一下通过程序显示整个通讯录而且能够选择当中某个联系人信息的步骤。
(a)创建并初始化一个ABPeoplePickerNavigationController对象
(b)设置其代理(delegate)
(c)用presentModalViewController:animated:这种方法进行显示整个通讯录页面
样例: 项目需求。一个lable,text是一个电话,把这个电话号 加入到通讯录中得莫一个人。
#import <AddressBookUI/ABNewPersonViewController.h>
#import <AddressBookUI/ABPeoplePickerNavigationController.h>
@property (strong,nonatomic)ABPeoplePickerNavigationController
*picker;
@property (strong,nonatomic)ABNewPersonViewController
* pickerPerson;
self.picker = [[ABPeoplePickerNavigationController
alloc]
init];
_picker.peoplePickerDelegate
= self;
self.pickerPerson = [[ABNewPersonViewController
alloc]
init];
_pickerPerson.newPersonViewDelegate =
self;
//先推出 联系人列表
-(void)editContactItemBtn:(id)editItem{
[self
presentViewController:_picker
animated:YES
completion:nil];
}
//实现代理,在点击联系人列表的时候,创建一个ABRecordRef。传给加入联系人列表
- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController*)peoplePicker didSelectPerson:(ABRecordRef)person{
ABRecordRef contactPerson = person;
NSString *firstName = (__bridge_transfer
NSString*)ABRecordCopyValue(contactPerson,
kABPersonFirstNameProperty);
NSString *lastName = (__bridge_transfer
NSString*)ABRecordCopyValue(contactPerson,
kABPersonLastNameProperty);
NSString * midName = (__bridge_transfer
NSString*)ABRecordCopyValue(contactPerson,
kABPersonMiddleNameProperty);
ABMultiValueRef phonesRef =
ABRecordCopyValue(contactPerson,
kABPersonPhoneProperty);
NSMutableArray * phones = [self
getMobilePhoneProperty:phonesRef];
if(phonesRef) {
CFRelease(phonesRef);
}
ABRecordRef newperson =
ABPersonCreate();
ABRecordSetValue(newperson,
kABPersonFirstNameProperty, CFBridgingRetain(firstName),
NULL);
ABRecordSetValue(newperson,
kABPersonMiddleNameProperty,
CFBridgingRetain(midName), NULL);
ABRecordSetValue(newperson,
kABPersonLastNameProperty, CFBridgingRetain(lastName),
NULL);
NSString * phone =
@"13212345678";
NSString * label =
@"其它";
NSDictionary * dic = [NSDictionary
dictionaryWithObjectsAndKeys:phone,@"phone",label,@"lable",
nil];
[phones addObject:dic];
ABMutableMultiValueRef mulRef =
ABMultiValueCreateMutable(kABMultiStringPropertyType);
for(int i =
; i < phones.count; i++){
NSDictionary * tempDic = [phones
objectAtIndex:i];
NSString * tempPhone = [tempDic
objectForKey:@"phone"];
NSString * templable = [tempDic
objectForKey:@"lable"];
ABMultiValueIdentifier multivalueIdentifier;
ABMultiValueAddValueAndLabel(mulRef, (__bridge
CFStringRef)tempPhone, (__bridge
CFStringRef)templable, &multivalueIdentifier);
}
ABRecordSetValue(newperson,
kABPersonPhoneProperty, mulRef, NULL);
if(mulRef)
CFRelease(mulRef);
_pickerPerson.displayedPerson =newperson;
[self
dismissViewControllerAnimated:YES
completion:nil];//先把当前的miss掉,然后再推出下个
UINavigationController * nav = [[UINavigationController
alloc]initWithRootViewController:_pickerPerson];
[self
presentViewController:nav animated:YES
completion:nil];
}
//加入联系人页面,不用区分是取消还是完毕,系统的功能。不用自己写了
- (void)newPersonViewController:(ABNewPersonViewController *)newPersonView didCompleteWithNewPerson:(ABRecordRef)person{
[self
dismissViewControllerAnimated:YES
completion:nil];
}
- (NSMutableArray *)getMobilePhoneProperty:(ABMultiValueRef)phonesRef
{
NSMutableArray * array = [NSMutableArray
array];
for (int k =
; k<ABMultiValueGetCount(phonesRef); k++)
{
//获取电话Label
NSString * personPhoneLabel = (__bridge
NSString*)ABAddressBookCopyLocalizedLabel(ABMultiValueCopyLabelAtIndex(phonesRef, k));
//获取該Label下的电话值
NSString * personPhone = (__bridge
NSString*)ABMultiValueCopyValueAtIndex(phonesRef, k);
if (personPhone) {
NSDictionary * dic = [NSDictionary
dictionaryWithObjectsAndKeys:personPhone,@"phone",personPhoneLabel,@"lable",
nil];
[array addObject:dic];
}
}
return array;
}
版权声明:本文博客原创文章,博客,未经同意,不得转载。
iOS 获取联系人,并调用系统地址簿UI的更多相关文章
- iOS 获取设备信息,mac地址,IP地址,设备名称
#import "DeviceInfoUtil.h" #import "GlobleData.h" #import "sys/utsname.h&qu ...
- iOS中 读取相册,调用系统相机 技术分享
技术内容:分别读取相册以及调取相机,将图片显示到imageView上 布局: 1.创建imageView 和 button 并为button一个关联pickerImage的事件 <div sty ...
- esp32使iOS 获取蓝牙外设的Mac地址
最近在做一个需要上下位机的项目,我负责的任务下位机,使用的主控芯片是esp32.这个项目中有一项是需要手机扫描二维码然后连接作为esp32的蓝牙.二维码中包含了mac地址信息,在手机扫描周围设备的时候 ...
- iOS - (个人隐私钱包调用系统本机TouchID指纹锁验证)
// // ViewController.m // TouchID指纹验证 // // Created by apple on 16/9/18. // Copyright © 2016年 ap ...
- iOS 获取设备型号以及IP地址
首先导入四个头文件 #include <sys/types.h> #include <sys/sysctl.h> #include <ifaddrs.h> #inc ...
- iOS 获取手机型号,系统版本
新添加判断iPhone 7.iPhone 7 Plus ,我手里没有7,判断不对表打我~ FQ找的资料:http://www.iphonehacks.com/download-iphone-ios-f ...
- ios openURL的使用(调用系统电话、浏览器、地图、邮件等)
Safari Any URL starting with http:// which does not point to maps.google.com or www.youtube.com is s ...
- ios获取本机网络IP地址方法
#include <ifaddrs.h> #include <arpa/inet.h> - (NSString *)getIPAddress { N ...
- iOS 获取WIFI SSID及MAC地址
NSString *ssid = @"Not Found"; NSString *macIp = @"Not Found"; CFArrayRef myArra ...
随机推荐
- Cocos2d-x内存管理解说在ios开发中
使用过 Cocos2d-x 都知道,其中有一套自己实现的内存管理机制,不同于一般 C++ 的编写常规,而在使用前,了解其原理是有必要的,网上已经有很多对内部实现详细解说的文章.而对于使用者而言,并不需 ...
- make 2>&1 | tee log.txt之小析
前言 接触过linux的人,或多或少都会了解一点make 2>&1 | tee log.txt这个命令. 1. make是什么? make是linux下一个非常强大的命令,简单点就是你要 ...
- ZOJ 3794 Greedy Driver
两次SPFA 第一关找:从1没有出发点到另一个点的多少是留给油箱 把边反过来再找一遍:重每一个点到终点最少须要多少油 Greedy Driver Time Limit: 2 Seconds ...
- 杭电acm阶段之理工大版
想參加全国软件设计大赛C/C++语言组的同学,假设前一篇<C和指针课后练习题总结>没看完的,请先看完而且依照上面的训练做完,然后做以下的训练. 传送门:http://blog.csdn.n ...
- Orchard
Orchard工作原理 概述 本文翻译仅供学习之用,了解Orchard工作原理设计思想.技术点及关键词,如有缺漏请不吝指正.鉴于能力有限定有诸多曲解或不完整的地方,请海涵.不定时完善整理. CMS不像 ...
- URAL1113(数学)
题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1113 根据样例分析: 1.沙漠只有500公里或者更短,这时很简单,一次搞定. 2.沙漠6 ...
- Laravel 中国 - 巨匠级PHP开发框架 Laravel 中国社区
http://m.baidu.com/from=844b/bd_page_type=1/ssid=0/uid=3151E6C0905477A13653132D762BB6FB/pu=sz%401320 ...
- 使用javaDate类代数据仓库维度表
使用javaDate类代数据仓库维度表 Date类别: ,返回一个相对日期的毫秒数.精确到毫秒.但不支持日期的国际化和分时区显示. Date 类从Java 开发包(JDK)1.0 就開始进化,当时它仅 ...
- (适合入门)JVM堆内存相关的启动参数:年轻一代、岁和永久代内存分配
假设你要观察JVM进程消耗的堆内存,通过命令工具jmap或可视化工具jvisualvm.exe.JVM这些参数的默认启动值.假设你想知道JVM内存分配策略,最开始手动设置这些参数.通过JDK统计结果, ...
- 每天一个JavaScript实例-html5拖拽
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...