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 ...
随机推荐
- 高级Bash脚本编程指南(27):文本处理命令(三)
高级Bash脚本编程指南(27):文本处理命令(三) 成于坚持,败于止步 处理文本和文本文件的命令 tr 字符转换过滤器. 必须使用引用或中括号, 这样做才是合理的. 引用可以阻止shell重新解释出 ...
- UITableView性能优化及手工绘制UITableViewCell
提高表视图的性能 UITableView作为应用中最常用的视图,它的性能优化问题几乎是经常提及.下面对在非网络访问情况下的表视图性能优化进行了主要的几点说明: 1.自定义类或XIB文件时 在系统提供的 ...
- cronjob不跑得原因
能是环境的不同,能够在cronjob中加个env > /tmp/env.output查看 应用要同一时候输出标准错误合标准输出到一个文件能够&> /tmp/t
- C++primer原书中的一个错误(派生类using声明对基类权限的影响)
在C++primer 第4版的 15章 15.2.5中有以下这样一段提示: "注解:派生类能够恢复继承成员的訪问级别,但不能使訪问级别比基类中原来指定的更严格或者更宽松." 在vs ...
- 《Android系统开发》笔记
<Android系统开发>笔记1:Android系统概述 Android四层架构: 1. Linux Kernel&driver层 a.依赖于Linux 2.6内核,包含安全性.内 ...
- shu_1241 邮局位置问题
http://202.121.199.212/JudgeOnline/problem.php?cid=1078&pid=5 分析: 由于题目中的距离是折线距离,所以能够分别考虑两个方向.又x方 ...
- SWT中的多线程(Invalid thread access)
最近在学习swt的东西,遇到一个问题,特转录如下. SWT异常: org.eclipse.swt.SWTException: Invalid thread access 在创建SWT界面的线程之外的线 ...
- MVC超链接
<1> return RedirectToAction(Index); //跳转到Index控制器 <%@ Page Language="C#" Inherits ...
- Linux 单用户模式的使用
在进入系统启动菜单时,选择kernel,输入"e"后进入,在kernel开头的启动项后输入(空格) /single或者 / 1,然后输入"b"重新启动机器,此时 ...
- 解决:Determining IP Information for eth0 一直停留 无法进入系统
问题场景: vm centos6.4网卡之前一直没异常,可今天启动时一直卡在Determining IP Information for eth0,无法进入系统.网上说了非常多办法,大多都是不着边的说 ...