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 ...
随机推荐
- 注册Dev的帮助文件
Download the CHM files from… Code: https://www.devexpress.com/Support/Documentation/download.xml?pla ...
- 13、Cocos2dx 3.0游戏开发找小三之3.0中的Director :郝萌主,一统江湖
重开发人员的劳动成果.转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27706967 游戏中的基本元素 在曾经文章中.我们具 ...
- liGDX life_cycle (生命周期)
本文章翻译自libGDX官方wiki,,转载请注明出处:http://blog.csdn.net/kent_todo/article/details/37940489 libGDX官方网址:http: ...
- SilkTest高级进阶系列8 – 放下榔头,立地成佛
在地球尚未毁灭的某天,手动测试的同事找到你所在的自动组,问是否可以帮助他们自动化一个需要连续添加100个条目的测试用例,因为他们觉得这是一个噩梦.你口头上说要先烟酒烟酒才能知道,但是内里早就满心欢喜: ...
- 谈论高并发(三十)解析java.util.concurrent各种组件(十二) 认识CyclicBarrier栅栏
这次谈话CyclicBarrier栅栏,如可以从它的名字可以看出,它是可重复使用. 它的功能和CountDownLatch类别似,也让一组线程等待,然后开始往下跑起来.但也有在两者之间有一些差别 1. ...
- 做一个牛XX的身份证号验证类(支持15位和18位)
原文:做一个牛XX的身份证号验证类(支持15位和18位) #region 是否合法的中国身份证号码 protected bool IsChineseID() { if (str.Length == 1 ...
- JavaEE session机制
JavaEE session机制 Http协议: 在讲session之前,必须说下Http协议,HTTP是一个client和server端请求和应答的标准(TCP).由HTTPclient发起一个请求 ...
- Struts2中指定的校验文件不起作用的原因
转载请注意出处:http://blog.csdn.net/bettarwang/article/details/39801733 我们知道,假设要为某个Action指定校验文件.那么就要将" ...
- 乞讨N!到底有多少0
分析: 对N质因数分解 N=2^x * 3^y * 5^z....因为10 = 2*5,所以末尾0的个数仅仅和x与z有关,每一对2和5相乘能够得到一个10.于是末尾0的个数=min(x,z).在实际中 ...
- Java LinkedBlockingQueue和ArrayBlockingQueue分析
LinkedBlockingQueue是一个链表实现的堵塞队列,在链表一头增加元素,假设队列满.就会堵塞.还有一头取出元素.假设队列为空.就会堵塞. LinkedBlockingQueue内部使用Re ...