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 ...
随机推荐
- [Android学习笔记]Context简单理解
一.Context是什么?上下文对象,可以理解为一个程序的运行的环境,从中可以获取当前程序的资源:getResources,getAssets 二.常见的Context有哪些?Application ...
- poj1639 Picnic Planning 最小度数限制生成树
题意:若干个人开车要去park聚会,可是park能停的车是有限的,为k.所以这些人要通过先开车到其它人家中,停车,然后拼车去聚会.另外,车的容量是无限的,他们家停车位也是无限的. 求开车总行程最短. ...
- JAVA泛型之<? extends T>:(通配符上限)和<? super T>(通配符下限)
一.通配符上限和通配符下限接受的类型 通配符上限:<? extends T> 通配符下限:<? super T> 以下代码是测试结果,注释为解释说明 package xayd. ...
- hdu 1070Milk
地址链接:http://acm.hdu.edu.cn/showproblem.php?pid=1070 题意:多看几遍,学着静下来心去看英文题 代码: #include<bits/stdc++. ...
- 积累的VC编程小技巧之组合框
1.如何正确的得到ComBox的指针 CComboBox *mComb = (CComboBox*)GetDlgItem(IDC_DuanCB); CComboBox *mComb = (CCombo ...
- STL 源代码分析 算法 stl_algo.h -- includes
本文senlie原,转载请保留此地址:http://blog.csdn.net/zhengsenlie includes(应用于有序区间) ------------------------------ ...
- 端口映射工具 redir/socat/xinetd - 运维技术 - 开源中国社区
端口映射工具 redir/socat/xinetd - 运维技术 - 开源中国社区 端口映射工具 redir/socat/xinetd 10人收藏此文章, 我要收藏 发表于3天前(2013-08 ...
- 轻松学习之Linux教程一 ubuntu14.04+windows双系统安装
本系列文章由@uid=hpw" style="color:rgb(255,0,0)">超人爱因斯坦出品.转载请注明出处. 文章链接:http:// ...
- 用N2N搭建简单的VPN
1. 概述 N2N是一款开源的P2P VPN软件,其作者是著名的开源网管软件ntop的作者Luca Deri. N2N是一个双层架构的VPN,它让用户能够在网络层上开发P2P应用的典型功能,而不是 ...
- uva 10003 Cutting Sticks(区间DP)
题目连接:10003 - Cutting Sticks 题目大意:给出一个长l的木棍, 再给出n个要求切割的点,每次切割的代价是当前木棍的长度, 现在要求输出最小代价. 解题思路:区间DP, 每次查找 ...