//

//  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. C++11中的右值引用

    原文出处:http://kuring.me/post/cpp11_right_reference May 18, 2015 移动构造函数 C++98中的左值和右值 C++11右值引用和移动语义 强制移 ...

  2. (转)log4j:WARN No appenders could be found for logger 解决方案

    我们在使用Log4j的时候,总是出现: log4j:WARN No appenders could be found for logger (org.apache.ibatis.logging.Log ...

  3. Cocos2d-JS v3.0 alpha 导入 cocostudio的ui配置

    1.在新项目的根文件夹下打开project.json文件,修改: "modules" : ["cocos2d", "extensions", ...

  4. 可变长参数列表误区与陷阱——va_arg不可接受的类型

    可变长参数列表误区与陷阱--va_arg不可接受的类型 实现一个有可变长参数列表函数的时候,会使用到stdarg.h(这里不讨论varargs.h)中提供的宏. 例如,我们要实现一个简易的my_pri ...

  5. Step By Step(Lua字符串库) (转)

    1. 基础字符串函数:    字符串库中有一些函数非常简单,如:    1). string.len(s) 返回字符串s的长度:    2). string.rep(s,n) 返回字符串s重复n次的结 ...

  6. Leetcode226:Invert Binary Tree

    Invert a binary tree. 4 / \ 2 7 / \ / \ 1 3 6 9 to 4 / \ 7 2 / \ / \ 9 6 3 1 /** * Definition for a ...

  7. Socket小项目的一些心得(鸣谢传智的教学视频)

    Socket是一种封装了四层通信的整体抽象入口,通常也称作"套接字",这是常用的四层通信这是访问Socket的流程图,这个分为客户端和服务器端,其中服务器端有以下步骤去建立,前面的 ...

  8. HDU 5458 Stability (树链剖分+并查集+set)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5458 给你n个点,m条边,q个操作,操作1是删边,操作2是问u到v之间的割边有多少条. 这题要倒着做才 ...

  9. How Tomcat Works(五)

    本文接下来介绍tomcat的默认连接器,Tomcat中的默认连接器必须满足以下要求: 实现org.apache.catalina.Connector接口 负责创建实现org.apache.catali ...

  10. DataTemplate和ControlTemplate的关系

    DataTemplate和ControlTemplate的关系(转载自haiziguo) 一.ContentControl中的DataTemplate 在开始之前,我们先去看一下ContentCont ...