IOS编程之通讯录
//
// 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编程之通讯录的更多相关文章
- iOS开发系列--通讯录、蓝牙、内购、GameCenter、iCloud、Passbook系统服务开发汇总
--系统应用与系统服务 iOS开发过程中有时候难免会使用iOS内置的一些应用软件和服务,例如QQ通讯录.微信电话本会使用iOS的通讯录,一些第三方软件会在应用内发送短信等.今天将和大家一起学习如何使用 ...
- iOS开发系列通讯录、蓝牙、内购、GameCenter、iCloud、Passbook系统服务开
--系统应用与系统服务 iOS开发过程中有时候难免会使用iOS内置的一些应用软件和服务,例如QQ通讯录.微信电话本会使用iOS的通讯录,一些第三方软件会在应用内发送短信等.今天将和大家一起学习如何使用 ...
- iOS开发系列--通讯录、蓝牙、
iOS开发过程中有时候难免会使用iOS内置的一些应用软件和服务,例如QQ通讯录.微信电话本会使用iOS的通讯录,一些第三方软件会在应用内发送短信等.今天将和大家一起学习如何使用系统应用.使用系统服务: ...
- iOS 编辑UITableView(根据iOS编程编写)
上个项目我们完成了 JXHomepwner 简单的应用展示,项目地址.本节我们需要在上节项目基础上,增加一些响应用户操作.包括添加,删除和移动表格. 编辑模式 UITableView 有一个名为 e ...
- [译] 二、开始iOS编程之前,你还需要做什么?
声明:本文翻译自AppCoda网站的文章:What You Need to Begin iOS Programming?,作者是创建者Simon Ng.如有异议,请联系博主. 更新:帖子已经重新被 ...
- IOS编程User Interface基础
IOS编程之User Interface基础 目录 概述 相关概念 常见问题 状态栏的隐藏 应用图标的设置 概述 IOS用户界面是APP呈现给用户最直观.最常用的方式,因此学会用户界面的编程是学习IO ...
- IOS编程之多线程
IOS编程之多线程 目录 概述——对多线程的理解 IOS中实现多线程的三种方式 NSThread 线程创建 线程的同步与锁 线程间的交互 线程的操作方法 NSOperation and NSOpera ...
- iOS编程——经过UUID和KeyChain来代替Mac地址实现iOS设备的唯一标示(OC版)
iOS编程——通过UUID和KeyChain来代替Mac地址实现iOS设备的唯一标示(OC版) 很多的应用都需要用到手机的唯一标示,而且要求这个唯一标示不能因为应用app的卸载或者改变而变化. 在iO ...
- IOS编程教程(八):在你的应用程序添加启动画面
IOS编程教程(八):在你的应用程序添加启动画面 虽然你可能认为你需要编写闪屏的代码,苹果已经可以非常轻松地把它做在Xcode中.不需要任何编码.你只需要做的是设置一些配置. 什么是闪屏 对于那些 ...
随机推荐
- 记录一下JS正则的坑
JS正则的单行模式有点问题 总之 . 符号匹配换行符号会有问题 暂时的解决方案是 html = html.replace(/[\r\n]/g,""); 附加一个 html = ht ...
- NServiceBus教程-消息传递与处理
nservicebus"的容错默认"设计的一部分,基础设施管理事务自动所以你不需要记住所有的线程和状态管理要素配置. 客户端和服务器 理想情况下,服务器代码处理消息事务,但它往往不 ...
- 转】MyEclipse使用总结——MyEclipse中配置WebLogic12c服务器
原博文出自于:http://www.cnblogs.com/xdp-gacl/p/4142495.html 感谢! MyEclipse中配置WebLogic12c服务器的步骤如下: [Window]→ ...
- Linux下的sort排序命令详解(一)
1 sort的工作原理 sort将文件的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出. [zookeeper@master rh]$ cat ...
- MSSQL手札一 MSSQL的游标
和oracle的不同,MSSQL中没有隐式游标的说法,也没有%type和%rowtype这样根据数据库字段实时更新变量含义的关键字,MSSQL的游标类似于oracle的显示游标,需要自己去手动关闭, ...
- 图片转换成base64_encode的链接代码示例
<?php $file = "example.jpg"; $type = getimagesize( $file ); //取得图片的大小,类型等 $file_content ...
- JVM启动参数小结
一:JVM启动参数共分为三类: 其一是标准参数(-),所有的JVM实现都必须实现这些参数的功能,而且向后兼容: 其二是非标准参数(-X),指的是JVM底层的一些配置参数, ...
- 安装、设置与启动MySql5.1.30绿色版的方法
1.解压 mysql-noinstall-5.1.30-win32.zip(下载地址http://dev.mysql.com/downloads/mysql/5.1.html) 2.在 F 盘建立目录 ...
- Spring REST实践之Spring Boot
Spring Boot基本描述 可以利用http://start.spring.io网站的进行Spring Boot的初始化构建.这个初始化构建器允许你输入工程基本信息.挑选工程支持的功能,最后会生成 ...
- 利用花生壳和IIS发布网页过程
老早利用做过类似的事情,但最近又忘了怎么弄的了,还是自己给自己总结下,省得以后到处找了. [动态域名绑定] 如果具有公网IP地址,申请一个免费的花生壳动态域名,再下一个花生壳客户,使用已经申请好的动态 ...