//

//  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. MFC知识点(DDX_Control 与 DDX_Text ,ON_COMMAND和ON_MESSAGE)

    1.DDX_Control 与 DDX_Text 区别 DDX_TEXT()的作用可以理解为把字符串变量和控件的文本(WindowText)关联起来, DDX_Control()的作用可以理解为把变量 ...

  2. MFC CString的L和_T

    这个问题困扰了很久,这个解释貌似好理解一些 L表示UNICODE串,比如wchar_t* str = L"yangsongx";_T在ANSI编译模式下表示ANSI串,在UNICO ...

  3. (转载)OC学习篇之---Foundation框架中的NSString对象和NSMutableString对象

    在之前的一篇文章中我们说到了Foundation框架中的NSObject对象,那么今天在在来继续看一下Foundation框架中的常用对象:NSString和NSMutableString. 在OC中 ...

  4. 【Python学习笔记】字符串操作

    字符串的表示 python中的字符串是一个常量,可以使用单引号'',双引号""或三引号""" """来创建一个字符串常量 ...

  5. 【boost】MFC dll中使用boost thread的问题

    项目需要,在MFC dll中使用了boost thread(<boost/thread.hpp>),LoadLibraryEx的时候出现断言错误,去掉thread库引用后断言消失. 百度g ...

  6. MySql 5.6 慢查询

    网上都巨坑 最后在官网找到了开启方法 原来是配置文件改了 Updated example for 2015 MySQL 5.6: slow_query_log = 1slow_query_log_fi ...

  7. SCAU 10678 神奇的异或

    10678 神奇的异或 时间限制:1000MS  内存限制:65535K 题型: 编程题   语言: 无限制 Description 在现在这个信息时代,数据是很重要的东西哦~ 很多时候,一条关键的数 ...

  8. TreeSet介绍

    一.TreeSet原理: 1.TreeSet存储对象的时候, 可以排序, 但是需要指定排序的算法 2.Integer能排序(有默认顺序), String能排序(有默认顺序), 自定义的类存储的时候出现 ...

  9. Windows PE3.0制作方法(从Win7中提取制作)

    Windows PE3.0制作方法(从Win7中提取制作 在d:新建文件夹winpe,在winpe中新建sources.pe3和new文件夹,把附件中提供的工具imagex连文件夹一起放到winpe目 ...

  10. HDU 1394Minimum Inversion Number(线段树)

    题目大意是说给你一个数组(N个),没戏可以将其首部的k(k<N)个元素移动至尾部,这样总共会形成N个序列 现在要求这n个序列中逆序对数最少的那一个序列有多少个逆序对 最初的确是没太多思路,就算知 ...