iOS通讯录操作封装(添加联系人、检查号码是否存在)
来源:互联网 发布:剑网三女神脸数据 编辑:程序博客网 时间:2024/04/30 15:37
SJABHelper.h
- #import <Foundation/Foundation.h>
- enum {
- ABHelperCanNotConncetToAddressBook,
- ABHelperExistSpecificContact,
- ABHelperNotExistSpecificContact
- };
- typedef NSUInteger ABHelperCheckExistResultType;
- @interface SJABHelper : NSObject
- // 添加联系人
- // name -> 联系人姓名
- // phoneNum -> 电话号码
- // label -> 电话号码的标签备注
- + (BOOL)addContactName:(NSString*)name phoneNum:(NSString*)num withLabel:(NSString*)label;
- // 查询指定号码是否已存在于通讯录
- // 返回值:
- // ABHelperCanNotConncetToAddressBook -> 连接通讯录失败(iOS6之后访问通讯录需要用户许可)
- // ABHelperExistSpecificContact -> 号码已存在
- // ABHelperNotExistSpecificContact -> 号码不存在
- + (ABHelperCheckExistResultType)existPhone:(NSString*)phoneNum;
- @end
SJABHelper.m
需要引入 AddressBook framework。
- #import "SJABHelper.h"
- #import <AddressBook/AddressBook.h>
- @implementation SJABHelper
- // 单列模式
- + (SJABHelper*)shareControl
- {
- static SJABHelper *instance;
- @synchronized(self) {
- if(!instance) {
- instance = [[SJABHelper alloc] init];
- }
- }
- return instance;
- }
- + (BOOL)addContactName:(NSString *)name phoneNum:(NSString *)num withLabel:(NSString *)label
- {
- return [[SJABHelper 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(0);
- ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error)
- {
- dispatch_semaphore_signal(sema);
- });
- dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
- dispatch_release(sema);
- }
- else
- {
- addressBook = ABAddressBookCreate();
- }
- // 将新建联系人记录添加如通讯录中
- BOOL success = ABAddressBookAddRecord(addressBook, record, &error);
- if (!success) {
- return NO;
- }else{
- // 如果添加记录成功,保存更新到通讯录数据库中
- success = ABAddressBookSave(addressBook, &error);
- return success ? YES : NO;
- }
- }
- + (ABHelperCheckExistResultType)existPhone:(NSString *)phoneNum
- {
- return [[SJABHelper shareControl] existPhone:phoneNum];
- }
- // 指定号码是否已经存在
- - (ABHelperCheckExistResultType)existPhone:(NSString*)phoneNum
- {
- ABAddressBookRef addressBook = nil;
- if ([[UIDevice currentDevice].systemVersion floatValue] >= 6.0)
- {
- 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);
- dispatch_release(sema);
- }
- else
- {
- addressBook = ABAddressBookCreate();
- }
- CFArrayRef records;
- if (addressBook) {
- // 获取通讯录中全部联系人
- records = ABAddressBookCopyArrayOfAllPeople(addressBook);
- }else{
- #ifdef DEBUG
- NSLog(@"can not connect to address book");
- #endif
- return ABHelperCanNotConncetToAddressBook;
- }
- // 遍历全部联系人,检查是否存在指定号码
- for (int i=0; i<CFArrayGetCount(records); i++) {
- ABRecordRef record = CFArrayGetValueAtIndex(records, i);
- CFTypeRef items = ABRecordCopyValue(record, kABPersonPhoneProperty);
- CFArrayRef phoneNums = ABMultiValueCopyArrayOfAllValues(items);
- if (phoneNums) {
- for (int j=0; j<CFArrayGetCount(phoneNums); j++) {
- NSString *phone = (NSString*)CFArrayGetValueAtIndex(phoneNums, j);
- if ([phone isEqualToString:phoneNum]) {
- return ABHelperExistSpecificContact;
- }
- }
- }
- }
- CFRelease(addressBook);
- return ABHelperNotExistSpecificContact;
- }
- @end
需要注意的就是iOS6中新的用户隐私保护使得调用 ABAddressBookCreate() 时会弹出alert让用户确认是否允许,需要加上代码:
- // 如果为iOS6以上系统,需要等待用户确认是否允许访问通讯录。
- if ([[UIDevice currentDevice].systemVersion floatValue] >= 6.0)
- {
- 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);
- dispatch_release(sema);
- }
不然addressBook在用户确认操作前是NULL,调用会导致程序crash。
0 0
- iOS通讯录操作封装(添加联系人、检查号码是否存在)
- 简单的iOS通讯录操作封装(添加联系人、检查号码是否存在
- 简单的iOS通讯录操作封装(添加联系人、检查号码是否存在
- iOS 通讯录操作 删除联系人 以及联系人多个号码 删除其中一个号码
- iOS 通讯录操作 删除联系人 以及联系人多个号码 如何删除其中一个号码
- ios 操作通讯录联系人
- ios 文件操作 检查文件是否存在
- Android ContentProvider(类容提供者)之操作通讯录联系人 添加查询联系人
- ios 操作通讯录联系人demo大全
- ios 操作通讯录联系人(ABAddressBook用法)
- ios 操作通讯录联系人demo大全
- Android通讯录添加号码
- android通讯录 添加联系人
- Android-通讯录:添加联系人
- 添加联系人至通讯录
- 检查代码是否存在整数操作安全漏洞
- iOS 检查本地是否存在某个文件
- Android通讯录联系人操作
- windows 7 在登录欢迎界面隐藏用户名
- 几条关于异常处理的备忘
- jsp转换为Servlet规则
- 学习:conv2
- 小米发布会猜想:平板电脑亮相 米3S缺席
- iOS通讯录操作封装(添加联系人、检查号码是否存在)
- java 当中引用类型数组
- linux yum命令详解
- java关闭子线程小结
- 2015-2016中国设计趋势报告
- C++中extern关键字使用
- IT启程之路1
- drawBitmap基本用法
- git不同linux版本说明