addressBookHelper.h
#import <Foundation/Foundation.h> enum {
ABHelperCanNotConncetToAddressBook,
ABHelperExistSpecificContact,
ABHelperNotExistSpecificContact
}; typedef NSUInteger ABHelperCheckExistResultType; @interface addressBookHelper : NSObject // 添加联系人
// name     -> 联系人姓名
// phoneNum -> 电话号码
// label    -> 电话号码的标签备注
+ (BOOL)addContactName:(NSString*)name phoneNum:(NSString*)num withLabel:(NSString*)label; // 查询指定号码是否已存在于通讯录
// 返回值:
//  ABHelperCanNotConncetToAddressBook -> 连接通讯录失败(iOS6之后访问通讯录需要用户许可)
//  ABHelperExistSpecificContact    -> 号码已存在
//  ABHelperNotExistSpecificContact  -> 号码不存在
+ (ABHelperCheckExistResultType)existPhone:(NSString*)phoneNum; @end addressBookHelper.m
#import "addressBookHelper.h"
#import <AddressBook/AddressBook.h> @implementation addressBookHelper // 单列模式
+ (addressBookHelper*)shareControl
{
static addressBookHelper *instance;
@synchronized(self) {
if(!instance) {
instance = [[addressBookHelper alloc] init];
}
}
return instance;
} + (BOOL)addContactName:(NSString *)name phoneNum:(NSString *)num withLabel:(NSString *)label
{
return [[addressBookHelper shareControl] addContactName:name phoneNum:num withLabel:label];
} // 添加联系人(联系人名称、号码、号码备注标签)
- (BOOL)addContactName:(NSString*)name phoneNum:(NSString*)num withLabel:(NSString*)label
{
// 创建一条空的联系人
ABRecordRef record = ABPersonCreate();
CFErrorRef error;
// 设置联系人的名字
ABRecordSetValue(record, kABPersonFirstNameProperty, (__bridge CFTypeRef)name, &error);
// 添加联系人电话号码以及该号码对应的标签名
ABMutableMultiValueRef multi = ABMultiValueCreateMutable(kABPersonPhoneProperty);
ABMultiValueAddValueAndLabel(multi, (__bridge CFTypeRef)num, (__bridge CFTypeRef)label, NULL);
ABRecordSetValue(record, kABPersonPhoneProperty, multi, &error); ABAddressBookRef addressBook = nil;
// 如果为iOS6以上系统,需要等待用户确认是否允许访问通讯录。
if ([[UIDevice currentDevice].systemVersion floatValue] >= 6.0)
{
addressBook = ABAddressBookCreateWithOptions(NULL, NULL);
//等待同意后向下执行
dispatch_semaphore_t sema = dispatch_semaphore_create();
ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error)
{
dispatch_semaphore_signal(sema);
});
dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
// dispatch_release(sema);
}
else
{
// addressBook = ABAddressBookCreate();
addressBook = ABAddressBookCreateWithOptions(NULL, (CFErrorRef *)&error);
} // 将新建联系人记录添加如通讯录中
BOOL success = ABAddressBookAddRecord(addressBook, record, &error);
if (!success) {
return NO;
}else{ // 如果添加记录成功,保存更新到通讯录数据库中
success = ABAddressBookSave(addressBook, &error);
return success ? YES : NO;
}
} + (ABHelperCheckExistResultType)existPhone:(NSString *)phoneNum
{
return [[addressBookHelper shareControl] existPhone:phoneNum];
} // 指定号码是否已经存在
- (ABHelperCheckExistResultType)existPhone:(NSString*)phoneNum
{
ABAddressBookRef addressBook = nil;
CFErrorRef error;
if ([[UIDevice currentDevice].systemVersion floatValue] >= 6.0)
{
addressBook = ABAddressBookCreateWithOptions(NULL, NULL);
//等待同意后向下执行
dispatch_semaphore_t sema = dispatch_semaphore_create();
ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error)
{
dispatch_semaphore_signal(sema);
});
dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
// dispatch_release(sema);
}
else
{
// addressBook = ABAddressBookCreate();
addressBook = ABAddressBookCreateWithOptions(NULL, (CFErrorRef *)&error);
}
CFArrayRef records;
if (addressBook) {
// 获取通讯录中全部联系人
records = ABAddressBookCopyArrayOfAllPeople(addressBook);
}else{
#ifdef DEBUG
NSLog(@"can not connect to address book");
#endif
return ABHelperCanNotConncetToAddressBook;
} // 遍历全部联系人,检查是否存在指定号码
for (int i=; i<CFArrayGetCount(records); i++) {
ABRecordRef record = CFArrayGetValueAtIndex(records, i);
CFTypeRef items = ABRecordCopyValue(record, kABPersonPhoneProperty);
CFArrayRef phoneNums = ABMultiValueCopyArrayOfAllValues(items);
if (phoneNums) {
for (int j=; j<CFArrayGetCount(phoneNums); j++) {
NSString *phone = (NSString*)CFArrayGetValueAtIndex(phoneNums, j);
if ([phone isEqualToString:phoneNum]) {
return ABHelperExistSpecificContact;
}
}
}
} CFRelease(addressBook);
return ABHelperNotExistSpecificContact;
} 使用
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view. NSString *phone = @""; if ([addressBookHelper existPhone:phone] == ABHelperExistSpecificContact)
{
UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"消息提示" message:[NSString stringWithFormat:@"手机号码:%@已存在通讯录",phone] delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
[alert show];
}
else
{
if ([addressBookHelper addContactName:@"刘德华" phoneNum:phone withLabel:@"测试"])
{
UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"消息提示" message:@"添加到通讯录成功" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
[alert show];
};
}
}

IOS 添加到通讯录的更多相关文章

  1. iOS开发--系统通讯录的访问与添加联系人

    公司项目有访问通讯录的需求,所以开始了探索之路.从开始的一无所知,到知识的渐渐清晰.这一切要感谢广大无私分享的 “coder”,注:我是尊称的语气! 苹果提供了访问系统通讯录的框架,以便开发者对系统通 ...

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

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

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

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

  4. IOS开发笔记 IOS如何访问通讯录

    IOS开发笔记  IOS如何访问通讯录 其实我是反对这类的需求,你说你读我的隐私,我肯定不愿意的. 幸好ios6.0 以后给了个权限控制.当打开app的时候你可以选择拒绝. 实现方法: [plain] ...

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

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

  6. iOS 添加功能引导图

    iOS 添加功能引导图 首次安装app之后,打开app首页,有一张功能引导图,其实最简单的一种做法是,直接在这个首页上加一个蒙层图片. 在蒙层上用气泡显示文字注明功能介绍,这个蒙层图片,让你们的UI设 ...

  7. IOS编程之通讯录

    // //  ViewController.m //  LearnAddressBook0 // //  Created by Mac on 14-7-28. //  Copyright (c) 20 ...

  8. iOS调用系统通讯录获取姓名电话号码(转)

    原文地址:http://blog.csdn.net/idoshi201109/article/details/46007125 OS调用系统通讯录获取姓名电话号码 (iOS 8.0 Xcode6.3可 ...

  9. iOS添加另一个控制器的时候要注意啊

    ios的父控制器控制器和子控制器之间的注意点: " >> #warning 需要把新创建出来的控制器添加成子控制器 . 不然子控制器里面的子控件无法响应点击事件 " 一 ...

随机推荐

  1. hdu 5428 The Factor(数学)

    Problem Description There is a sequence of n positive integers. Fancycoder is addicted to learn thei ...

  2. 使用Open Flash Chart(OFC)制作图表(Struts2处理)

    Java开源项目中制作图表比较出色的就是JFreeChart了,相信大家都听说过,它不仅可以做出非常漂亮的柱状图,饼状图,折线图基本图形之外,还能制作甘特图,仪表盘等图表.在Web应用中可以为项目增色 ...

  3. Memcached完全解剖–1. memcached基金会

    翻译一篇技术评论社的文章,是讲memcached的连载.fcicq同学说这个东西非常实用,希望大家喜欢. 发表日:2008/7/2  作者:长野雅广(Masahiro Nagano)  原文链接:ht ...

  4. 用ajaxFileUpLoad上传文件不能正确取得返回值的问题

    刚開始没有认为ajax请求的dataType參数的重要性,用了ajaxFileUpLoad插件后,假设页面代码例如以下: fileElementId : ['imageToUpload'], url ...

  5. windows 和linux 同步api对比

    初始化临界区 (win) InitializeCriticalSection(RTL_CRITICAL_SECTION &rtl_critial_section) (linux) pthrea ...

  6. [core java学习笔记][第十章部署应用程序]

    第10章 部署应用程序和applet jar文件 Java Web Start 10.1 jar文件 jar文件就是一个压缩了类,图像和声音的ZIP压缩文件 创建一个新的JAR文件应该使用的常见命令格 ...

  7. AE分级渲染

    分级渲染classbreakrenderer位于carto类库中,进行分级渲染时,首先要将相应图层按照某一Field分级.可使用esrisystem类库中的iclassifyGEN类的classify ...

  8. C++菱形继承的构造函数

    网上搜了很多,大多是关于菱形虚继承的构造函数应该怎么写,或者就是最简单的,四个类都不带参数的构造函数. 本文旨在记录一下困扰了博主1h的问题,非常浅显,有帮助固然好,如果侮辱谁的智商还见谅,当然无限欢 ...

  9. 自制获取data-自定义属性

    jQuery.fn.dataset = function(attr, val) { // 获取数据集 if (arguments.length == 0) { var dataset = {}; jQ ...

  10. ios开发中的基本设计模式

    (一)代理模式应用场景:当一个类的某些功能需要由别的类来实现,但是又不确定具体会是哪个类实现.优势:解耦合敏捷原则:开放-封闭原则实例:tableview的 数据源delegate,通过和protoc ...