//

//  ViewController.m

//  LearnAddressBook0

//

//  Created by Mac on 14-7-28.

//  Copyright (c) 2014年 Digital media technology. All rights reserved.

//

#import "ViewController.h"

#import <AddressBook/AddressBook.h>

#import <AddressBookUI/AddressBookUI.h>

#import "Contact.h"

@interfaceViewController () <ABPeoplePickerNavigationControllerDelegate>

@property (weak, nonatomic)
IBOutletUITextField *phoneNumTextField;

@end

@implementation ViewController

- (void)viewDidLoad

{

[superviewDidLoad];

// Do any additional setup after loading the view, typically from a nib.

}

- (IBAction)btn:(id)sender {

//获得通讯录的所有联系人数据,并且打印出来

[selfloadAddressBook];

}

- (IBAction)addAContacts:(id)sender {

Contact *contact = [[Contact
alloc] init];

contact.firstName = @"new";

[selfaddContact:contact addressBookRef:[selfcreateAddressBook]];

}

- (IBAction)deleteAContacts:(id)sender {

[selfdeleteContact:@"Jenny"addressBookRef:[selfcreateAddressBook]];

}

- (IBAction)choseAContact:(id)sender {

ABPeoplePickerNavigationController *picker = [[ABPeoplePickerNavigationControlleralloc] init];

picker.peoplePickerDelegate =
self;

[selfpresentViewController:picker animated:YEScompletion:^{}];

}

//1、查询通讯录信息

-(ABAddressBookRef)createAddressBook{

ABAddressBookRef addressBook;

if ([[UIDevicecurrentDevice].systemVersion
floatValue] >= 6.0)//判断ios版本

{

addressBook = ABAddressBookCreateWithOptions(NULL,
NULL);

//等待同意后向下执行

dispatch_semaphore_t sema =
dispatch_semaphore_create(0);

ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted,
CFErrorRef error) {

dispatch_semaphore_signal(sema);

});

dispatch_semaphore_wait(sema,
DISPATCH_TIME_FOREVER);

} else {

addressBook = ABAddressBookCreate();

}

return addressBook;

}

//2.获取联系人信息(Contact为自定义联系人信息类)

-(void)loadAddressBook{

NSMutableArray *contactArray = [[NSMutableArrayalloc] init];

ABAddressBookRef addressBook = [selfcreateAddressBook];

//是否有访问通讯录的权限

if (!addressBook) {

UIAlertView *alertView = [[UIAlertView
alloc] initWithTitle:@"提醒"
message:@"通讯录未有权限,请在设置-隐私中进行更改" delegate:nil cancelButtonTitle:@"OK"
otherButtonTitles:nil,
nil];

[alertView show];

}

CFArrayRef allPeople =
ABAddressBookCopyArrayOfAllPeople(addressBook);

//获取通讯录联系人的名字信息

NSString *firstName, *lastName, *fullName;

for (id person
in (__bridge NSArray*)allPeople) {

//Contact *contact = [[Contact alloc] init];

firstName = (__bridgeNSString*)ABRecordCopyValue((__bridgeABRecordRef)(person), kABPersonFirstNameProperty);

NSLog(@"first is:%@",firstName);

if (firstName == nil) {

firstName = @"";

}

lastName = (__bridgeNSString*)ABRecordCopyValue((__bridgeABRecordRef)(person), kABPersonLastNameProperty);

NSLog(@"last name is:%@",lastName);

if (lastName == nil) {

lastName = @"";

}

fullName = [lastName stringByAppendingFormat:@"%@",firstName];

NSLog(@"%@",fullName);

/////////////////////////////////////////////////////////////////////////

//获取通讯录联系人的电话号码(多值)和电子邮件(多值)

ABMultiValueRef phones = (ABMultiValueRef)ABRecordCopyValue((__bridgeABRecordRef)(person), kABPersonPhoneProperty);

for (int i = 0; i <
ABMultiValueGetCount(phones); i++) {

NSString *phone = (__bridgeNSString*)ABMultiValueCopyValueAtIndex(phones, i);

NSLog(@"phone number is %@",phone);

}

ABMultiValueRef mails = (ABMultiValueRef)ABRecordCopyValue((__bridgeABRecordRef)(person), kABPersonEmailProperty);

for (int i = 0; i <
ABMultiValueGetCount(mails); i++) {

NSString *mail = (__bridgeNSString*)ABMultiValueCopyValueAtIndex(mails, i);

NSLog(@"email is %@",mail);

}

}

/////////////////////////////////////////////////////////////////////////

if (allPeople) {

CFRelease(allPeople);

}

if (addressBook) {

CFRelease(addressBook);

}

}

//2、添加联系人信息

-(void)addContact:(Contact *)contact addressBookRef:(ABAddressBookRef)addrBookRef{

ABRecordRef person =
ABPersonCreate();

ABRecordSetValue(person,
kABPersonFirstNameProperty, (__bridgeCFTypeRef)(contact.firstName),
NULL);

ABRecordSetValue(person,
kABPersonLastNameProperty, (__bridgeCFTypeRef)(contact.lastName),
NULL);

ABMutableMultiValueRef mulRef =
ABMultiValueCreateMutable(kABMultiStringPropertyType);

for (int i = 0; i < contact.phoneArray.count; i++) {

ABMultiValueIdentifier multivalueIdentifier;

ABMultiValueAddValueAndLabel(mulRef, (__bridge
CFTypeRef)([contact.phoneArray
objectAtIndex:i]), nil, &multivalueIdentifier);

}

ABRecordSetValue(person,
kABPersonPhoneProperty, mulRef, NULL);

if (mulRef) {

CFRelease(mulRef);

}

if ([contact mail] !=
nil && ![contact.mail
isEqualToString:@""]) {

ABMutableMultiValueRef mulRef3 =
ABMultiValueCreateMutable(kABMultiStringPropertyType);

ABMultiValueIdentifier multivalueIdentifier;

ABMultiValueAddValueAndLabel(mulRef3, (__bridge
CFTypeRef)(contact.mail),
nil, &multivalueIdentifier);

ABRecordSetValue(person,
kABPersonEmailProperty, mulRef3, NULL);

if (mulRef3) {

CFRelease(mulRef3);

}

}

ABAddressBookAddRecord(addrBookRef, person,
NULL);

if (person) {

CFRelease(person);

}

ABAddressBookSave(addrBookRef,
nil);//保存对通讯录的修改(重点),如需要添加多条联系人信息,将该行代码放到添加联系人信息的循环之后,执行速度比每添加一条联系人信息就保存一次对通讯录的修改要快很多

}

//3、删除联系人信息

-(void)deleteContact:(NSString *)fullName addressBookRef:(ABAddressBookRef)addrBookRef{

CFArrayRef allPeople =
ABAddressBookCopyArrayOfAllPeople(addrBookRef);

NSString *firstName, *lastName;

for (id person
in (__bridge NSArray*)allPeople) {

firstName = (__bridgeNSString*)ABRecordCopyValue((__bridgeABRecordRef)(person), kABPersonFirstNameProperty);

if (firstName == nil) {

firstName = @"";

}

lastName = (__bridgeNSString*)ABRecordCopyValue((__bridgeABRecordRef)(person), kABPersonLastNameProperty);

if (lastName == nil) {

lastName = @"";

}

if ([fullName isEqualToString:[lastName
stringByAppendingFormat:@"%@",firstName]]) {

ABAddressBookRemoveRecord(addrBookRef, (__bridge
ABRecordRef)(person), NULL);

break;

}

}

if (allPeople) {

CFRelease(allPeople);

}

ABAddressBookSave(addrBookRef,
nil);//保存对通讯录的修改(重点),如需要删除多条联系人信息,将该行代码放到删除联系人信息的循环之后,执行速度比每删除一条联系人信息就保存一次对通讯录的修改要快很多

}

#pragma mark peoplePickerDelegate

- (void)peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)peoplePicker

{

[selfdismissViewControllerAnimated:YEScompletion:^{}];

}

- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person

{

returnYES;

}

- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker

shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier{

NSString* compositeName = (__bridgeNSString *)ABRecordCopyCompositeName(person);

ABMultiValueRef phoneProperty =
ABRecordCopyValue(person,property);

NSString *phone = (__bridge
NSString *)ABMultiValueCopyValueAtIndex(phoneProperty,identifier);

_phoneNumTextField.text= (NSString*)phone;

[selfdismissViewControllerAnimated:YEScompletion:^{}];

returnNO;

}

- (void)didReceiveMemoryWarning

{

[superdidReceiveMemoryWarning];

// Dispose of any resources that can be recreated.

}

@end

IOS编程之通讯录的更多相关文章

  1. iOS开发系列--通讯录、蓝牙、内购、GameCenter、iCloud、Passbook系统服务开发汇总

    --系统应用与系统服务 iOS开发过程中有时候难免会使用iOS内置的一些应用软件和服务,例如QQ通讯录.微信电话本会使用iOS的通讯录,一些第三方软件会在应用内发送短信等.今天将和大家一起学习如何使用 ...

  2. iOS开发系列通讯录、蓝牙、内购、GameCenter、iCloud、Passbook系统服务开

    --系统应用与系统服务 iOS开发过程中有时候难免会使用iOS内置的一些应用软件和服务,例如QQ通讯录.微信电话本会使用iOS的通讯录,一些第三方软件会在应用内发送短信等.今天将和大家一起学习如何使用 ...

  3. iOS开发系列--通讯录、蓝牙、

    iOS开发过程中有时候难免会使用iOS内置的一些应用软件和服务,例如QQ通讯录.微信电话本会使用iOS的通讯录,一些第三方软件会在应用内发送短信等.今天将和大家一起学习如何使用系统应用.使用系统服务: ...

  4. iOS 编辑UITableView(根据iOS编程编写)

    上个项目我们完成了 JXHomepwner 简单的应用展示,项目地址.本节我们需要在上节项目基础上,增加一些响应用户操作.包括添加,删除和移动表格. 编辑模式 UITableView 有一个名为  e ...

  5. [译] 二、开始iOS编程之前,你还需要做什么?

    声明:本文翻译自AppCoda网站的文章:What You Need to Begin iOS Programming?,作者是创建者Simon Ng.如有异议,请联系博主.   更新:帖子已经重新被 ...

  6. IOS编程User Interface基础

    IOS编程之User Interface基础 目录 概述 相关概念 常见问题 状态栏的隐藏 应用图标的设置 概述 IOS用户界面是APP呈现给用户最直观.最常用的方式,因此学会用户界面的编程是学习IO ...

  7. IOS编程之多线程

    IOS编程之多线程 目录 概述——对多线程的理解 IOS中实现多线程的三种方式 NSThread 线程创建 线程的同步与锁 线程间的交互 线程的操作方法 NSOperation and NSOpera ...

  8. iOS编程——经过UUID和KeyChain来代替Mac地址实现iOS设备的唯一标示(OC版)

    iOS编程——通过UUID和KeyChain来代替Mac地址实现iOS设备的唯一标示(OC版) 很多的应用都需要用到手机的唯一标示,而且要求这个唯一标示不能因为应用app的卸载或者改变而变化. 在iO ...

  9. IOS编程教程(八):在你的应用程序添加启动画面

    IOS编程教程(八):在你的应用程序添加启动画面   虽然你可能认为你需要编写闪屏的代码,苹果已经可以非常轻松地把它做在Xcode中.不需要任何编码.你只需要做的是设置一些配置. 什么是闪屏 对于那些 ...

随机推荐

  1. Office2013版的破解之路

    追着潮流,我还是更新了我的所有软件,2013版早就下载了,因为一直破解的问题没有装,这次终于找到必成功的办法. 1.准备工作: 下载office2013的官方版即可,官方版里不包含project和vi ...

  2. R工作空间

    工作空间,指的是你现有的R语言工作环境,它包括了任何一个用户定义的对象,比如:向量,矩阵,数据结构,列表,方法等.在一个R会话结束的时候,你可以保存现有的工作空间的映像,在下一次R启动的时候,该工作空 ...

  3. 性能测试-ApacheBench

    基本简介 ApacheBench 是一个指令列程式,专门用来执行网站服务器的运行效能,特别是针对Apache 网站服务器.这原本是用来检测 Apache 网站服务器能够提供的效能,特别是可以看出Apa ...

  4. django 搭建自己的博客

    原文链接:http://www.errdev.com/post/4/ 每一个爱折腾的程序员都有自己的博客,好吧,虽然我不太喜欢写博客,但是这样骚包的想法却不断涌现.博客园虽好,可以没有完全的掌控感,搭 ...

  5. 第三百五十五天 how can I 坚持

    快一年了,三百五十五天了,等写个程序算算时间,看看日期和天数能不能对的上,哈哈. 计划还是未制定,天气预报还是没有写完,立马行动,发完这个博客,立马行动. 计划:设计模式1个月,三大框架3个月,计算机 ...

  6. Unity3D 200个插件免费分享

    插件清单: 2D_Toolkit_1.51     动画开发插件包 FingerGestures           触摸插件 ORK_Okashi_RPG_Kit       Unity3D角色扮演 ...

  7. Maven Archetype Plugin

    使用Archetype的一般步骤 命令——mvn archetype:generate 输入命令后,Archetype插件会输出一个Archetype列表供用户选择:选择自己想要使用的Archetyp ...

  8. oracle出现的小问题

    oracle无法解析指定的标识符:检查oracle的数据库实例名是否正确. oracle增大db_files:alter system set db_files=1000 scope=spfile;之 ...

  9. HTML5-企业宣传6款免费源码

    本文主要分享了6个很不错的HTML5宣传模板源码,这些生动具体的介绍了各个公司的产品及公司各类应用,有汽车.旅游.公司,房产等Query特效,大家一起来欣赏吧. 一.九秒教育企业海报(移动端)这次要分 ...

  10. HDU 5884 Sort (二分)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5884 nn个有序序列的归并排序.每次可以选择不超过kk个序列进行合并,合并代价为这些序列的长度和.总的 ...