IOS 添加到通讯录
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 添加到通讯录的更多相关文章
- iOS开发--系统通讯录的访问与添加联系人
公司项目有访问通讯录的需求,所以开始了探索之路.从开始的一无所知,到知识的渐渐清晰.这一切要感谢广大无私分享的 “coder”,注:我是尊称的语气! 苹果提供了访问系统通讯录的框架,以便开发者对系统通 ...
- iOS开发系列--通讯录、蓝牙、内购、GameCenter、iCloud、Passbook系统服务开发汇总
--系统应用与系统服务 iOS开发过程中有时候难免会使用iOS内置的一些应用软件和服务,例如QQ通讯录.微信电话本会使用iOS的通讯录,一些第三方软件会在应用内发送短信等.今天将和大家一起学习如何使用 ...
- iOS开发系列通讯录、蓝牙、内购、GameCenter、iCloud、Passbook系统服务开
--系统应用与系统服务 iOS开发过程中有时候难免会使用iOS内置的一些应用软件和服务,例如QQ通讯录.微信电话本会使用iOS的通讯录,一些第三方软件会在应用内发送短信等.今天将和大家一起学习如何使用 ...
- IOS开发笔记 IOS如何访问通讯录
IOS开发笔记 IOS如何访问通讯录 其实我是反对这类的需求,你说你读我的隐私,我肯定不愿意的. 幸好ios6.0 以后给了个权限控制.当打开app的时候你可以选择拒绝. 实现方法: [plain] ...
- iOS开发系列--通讯录、蓝牙、
iOS开发过程中有时候难免会使用iOS内置的一些应用软件和服务,例如QQ通讯录.微信电话本会使用iOS的通讯录,一些第三方软件会在应用内发送短信等.今天将和大家一起学习如何使用系统应用.使用系统服务: ...
- iOS 添加功能引导图
iOS 添加功能引导图 首次安装app之后,打开app首页,有一张功能引导图,其实最简单的一种做法是,直接在这个首页上加一个蒙层图片. 在蒙层上用气泡显示文字注明功能介绍,这个蒙层图片,让你们的UI设 ...
- IOS编程之通讯录
// // ViewController.m // LearnAddressBook0 // // Created by Mac on 14-7-28. // Copyright (c) 20 ...
- iOS调用系统通讯录获取姓名电话号码(转)
原文地址:http://blog.csdn.net/idoshi201109/article/details/46007125 OS调用系统通讯录获取姓名电话号码 (iOS 8.0 Xcode6.3可 ...
- iOS添加另一个控制器的时候要注意啊
ios的父控制器控制器和子控制器之间的注意点: " >> #warning 需要把新创建出来的控制器添加成子控制器 . 不然子控制器里面的子控件无法响应点击事件 " 一 ...
随机推荐
- PHP设计模式笔记一:准备工作 -- Rango韩老师 http://www.imooc.com/learn/236
一.编程字体选择 1.选择等宽字体 包括Courier New ,Consolas,Source Code Pro(推荐) 2.环境搭建(建议easyPHP) 二.开发符合PSR规范的基础框架 PSR ...
- JS学习笔记-数组
ECMAScript中没有提供类和接口等的定义,但它却是一门面向对象的语言,由于它能够通过其它 方式实现类似高级语言的面向对象功能,这些内容将在后面的文章中进行一步步的总结.此篇仅对JS中对象作简要说 ...
- Maxiee的Vim入门日记(4)——安装windows下的Cscope
Maxiee今天又学到了一个插件——Cscope.Cscope 是一款用于查看大型工程中的代码的软件.它使用方便,支持快速查找 C Symbol.function 等在工程中所有出现的位置,而不用自己 ...
- AFNetwork 作用和使用方法具体解释
转自:http://www.maxiaoguo.com/clothes/269.html AFNetworking是一个轻量级的iOS网络通信类库.它建立在NSURLConnection和NSOper ...
- ssh公私钥登录方式设置
在Linux中ssh登录远程主机的时候能够进行公私钥的认证方式. ①环境说明:两台Linux主机,host1:192.168.5.1,host2:192.168.5.10. 如今在host1上面设置然 ...
- 该如何关闭thinkphp的缓存呢?有下面几种方法可参考:
该如何关闭thinkphp的缓存呢?有下面几种方法可参考: (1)在配置文件中关闭缓存 在你的配置文件config.php文件中加上如下两句: 复制代码代码如下: 'TMPL_CACHE_ON' ...
- 获取被选择的radio的值
function selectRadio() { var val = $('input:radio[name="address_select"]:checked').val(); ...
- Linux中oracle的安装,亲测
一.下载oracle的软件包 地址: http://www.oracle.com/technetwork/database/enterprise-edition/downloads/112010-li ...
- setNeedsDisplay、layoutSubViews
UIView的setNeedsDisplay和setNeedsLayout方法.首先两个方法都是异步执行的.而setNeedsDisplay会调 用自动调用drawRect方法,这样可以拿到UIGra ...
- pymssql文档
原文地址 http://pymssql.org/en/latest/ref/_mssql.html _mssql module reference pymssql模块类,方法和属性的完整文档. Com ...