//

//  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语言环境下使用google protobuf

    本文写给经常使用C编程且不喜欢C++而又要经常使用google protobuf的人.        经常写通讯程序的人对数据进行序列化或者反序列化时,可能经常使用google的protobuf(PB ...

  2. proguard 混淆android代码

    官网 http://proguard.sourceforge.net/#manual/examples.html android 2.3后,新建的project默认就有一个project.proper ...

  3. ubuntu cloud-archive 软件包 无法验证包来源

  4. ERROR (ClientException) nova image-list

    nova image-listERROR (ClientException): The server has either erred or is incapable of performi9e-6c ...

  5. 转】MyEclipse使用总结——使用MyEclipse打包带源码的jar包

    原博文出自于: http://www.cnblogs.com/xdp-gacl/p/4136303.html 感谢! 平时开发中,我们喜欢将一些类打包成jar包,然后在别的项目中继续使用,不过由于看不 ...

  6. Linux下的grep搜索命令详解(一)

    Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来.grep全称是Global Regular Expression Print,表示全局正则表达 ...

  7. HDU 3920Clear All of Them I(状压DP)

    HDU 3920   Clear All of Them I 题目是说有2n个敌人,现在可以发n枚炮弹,每枚炮弹可以(可以且仅可以)打两个敌人,每一枚炮弹的花费等于它所行进的距离,现在要消灭所有的敌人 ...

  8. HDU3874Necklace(树状数组+离线操作)

    此题的大意思说有一串珠子,每个珠子都有自己的欣赏值value,现在给你一串珠子每个的欣赏值,并给出一些询问,查询某个区间内部总欣赏值是多少,但是有一个约定就是如果这个区间内部有两个珠子的欣赏值是一样的 ...

  9. openmp 并行求完数

    // GetWanShu.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include "omp.h" #inclu ...

  10. window.print打印指定div

    window.print可以打印网页,但有时候我们只希望打印特定控件或内容,怎么办呢? 首先我们可以把要打印的内容放在div中,然后用下面的代码进行打印. <html> <head& ...