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){

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),
^{

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];

NSUInteger i =0;

for (i =0; 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);

}

if (contact.phone.count >0)
{

[mutableContactsaddObject:contact];

}

}

if(addressBook) {

CFRelease(addressBook);

}

//处理获取通讯后的逻辑

}

});

}

- (NSMutableArray *)getMobilePhoneProperty:(ABMultiValueRef)phonesRef

{

NSMutableArray * array = [NSMutableArrayarray];

for (int k =0; 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 =
0; 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 =
0; 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;

}

版权声明:本文博客原创文章,博客,未经同意,不得转载。

时间: 2024-10-10 02:05:09

iOS 获取联系人,并调用系统地址簿UI的相关文章

android 调用系统相机获取图片、调用系统相册获取图片,并对图片进行截取

打开系统相册获取图片并截取,代码相对简单 1 Intent intent = new Intent(Intent.ACTION_GET_CONTENT,null); 2 intent.setType("image/*"); 3 intent.putExtra("crop", "true"); 4 5 //WIDTH 和 HEIGHT指的是截取框的宽高比例,如设WIDTH = 1,HEIGHT = 1,截取框就为正方形 6 intent.putEx

iOS中 读取相册,调用系统相机 技术分享

技术内容:分别读取相册以及调取相机,将图片显示到imageView上 布局: 1.创建imageView 和 button 并为button一个关联pickerImage的事件 [objc] view plaincopy <div style="text-align: left;"><span style="font-family: Helvetica; -webkit-text-stroke-width: initial;">    sel

IOS获取系统通讯录联系人信息

先导入AddressBook.framework先 然后引用  #import <AddressBook/AddressBook.h> 一.权限注册 随着apple对用户隐私的越来越重视,IOS系统的权限设置也更加严格,在获取系统通讯录之前,我们必须获得用户的授权.权限申请代码示例如下: #pragma mark - 注册权限 - (void)contacts { //这个变量用于记录授权是否成功,即用户是否允许我们访问通讯录 int __block tip = 0; //声明一个通讯簿的引用

iOS框架—使用地址簿

一.为何支持地址簿很重要: 当开发iOS软件的时候,就与用户的移动生活建立了联系.用户走到哪里都带着移动设备,可以说移动设备与用户的个人生活(从日历到个人相册)休戚相关.在这种移动生活中,通讯录占据着重要的位置.应用可以使用联系人数据库确定用户是否有朋友注册了相关服务:分析联系人的电子邮件地址或电话号码,并将联系人自动添加为好友.应用还可以使用联系人列表自动填写邮件地址或电话号码,或让用户通过蓝牙与朋友分享联系人信息.应用需要访问用户通讯录的原因不胜枚举. 注意: 除非有充分的理由,否则不要访问

IOS中调用系统的电话、短信、邮件、浏览功能

iOS开发系列--通讯录.蓝牙.内购.GameCenter.iCloud.Passbook系统服务开发汇总 2015-01-13 09:16 by KenshinCui, 26990 阅读, 35 评论, 收藏, 编辑 --系统应用与系统服务 iOS开发过程中有时候难免会使用iOS内置的一些应用软件和服务,例如QQ通讯录.微信电话本会使用iOS的通讯录,一些第三方软件会在应用内发送短信等.今天将和大家一起学习如何使用系统应用.使用系统服务: 调用系统应用 使用系统服务目 录 短信与邮件 通讯录

怎么调用系统通讯录并向被选中联系人发送短信

每做一个项目都会有收获,前提是要在这个项目上付出努力的! 好吧,如今讲一下:怎么通过调用系统通讯录,当你点击联系人姓名时,跳转到向其发送短信的页面<收件人是被点中的联系人,短信已自己主动编辑>. 看看图片效果: 以下看一下具体代码: Uri result = data.getData(); String phoneName = getPhoneContacts(result); Log.d("phone", "---------->phoneName==&q

Android图片系列(1)-------调用系统相册与相机获取图片

Android开发过程中,我们经常需要获取图片,你可以通过获取手机相册的图片,也可以调用相机拍照获取图片.这里主要讲这两个获取图片的方式,并记录其中遇到的小问题. 调用相册获取图片 这个功能非常简单,这里不多说了,这里贴出关键代码 Intent openAlbumIntent = new Intent(Intent.ACTION_GET_CONTENT); openAlbumIntent.setType("image/*"); startActivityForResult(openAl

iOS 通讯录-获取联系人属性

内容均来自关东升老师的ios开发指南 上一篇写了联系人框架的一些必须知道的知识 现在写一下读取联系人数据相关操作 要读取通讯录数据库 需要 创建通讯录对象 查询获取数据(所有或者部分) 获取通讯录某一条记录(某个人的所有数据) 获取这个人的各种属性数据 就是这样 CFErrorRef error = NULL; //创建一个通讯录操作对象 ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, &error); 第一

iOS调用系统发短信功能详解

iOS调用系统的发短信功能可以分为两种:1,程序外调用系统发短信.2,程序内调用系统发短信.第二种的好处是用户发短信之后还可以回到app.这对app来说非常重要. 程序外调用系统发短信 这个方法其实很简单,直接调用openURL即可: [[UIApplication sharedApplication]openURL:[NSURL URLWithString:@"sms://13888888888"]]; 程序内调用系统发短信 1)导入MessageUI.framework,并引入头文