简单的iOS通讯录操作封装(添加联系人、检查号码是否存在
2013-05-13 21:46
976 查看
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。
需要注意的就是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。
#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。
相关文章推荐
- 简单的iOS通讯录操作封装(添加联系人、检查号码是否存在
- 简单的iOS通讯录操作封装(添加联系人、检查号码是否存在)
- iOS通讯录操作封装(添加联系人、检查号码是否存在)
- ios 文件操作 检查文件是否存在 创建文件目录 iphone
- ios 文件操作 检查文件是否存在
- iOS 通讯录操作 删除联系人 以及联系人多个号码 如何删除其中一个号码
- iOS 通讯录操作 删除联系人 以及联系人多个号码 删除其中一个号码
- 动软中,在连接服务器时,出现“添加服务器配置失败,请检查是否有写入权限或文件是否存在“错误
- 简单封装sqlite3 实现实体对象与关系型数据库的相关操作【IOS】
- ios 操作通讯录联系人
- 动软中,在连接服务器时,出现“添加服务器配置失败,请检查是否有写入权限或文件是否存在“错误
- spring mvc 检查添加的某个字段是否在数据库里已经存在
- iOS文件和文件夹的创建,删除,移动, 拷贝,是否存在及简单数据类型的读写
- 【ios】使用Block对POST异步操作的简单封装
- 检查代码是否存在整数操作安全漏洞
- QTP实例:新增用户实例,包含邮箱、手机号码的验证,还判断了添加账户是否已存在数据库的问题
- iOS开发--系统通讯录的访问与添加联系人
- C# 文件、文件夹操作语句(删除,创建,移动,检查是否存在)
- iOS 检查本地是否存在某个文件
- android 联系人操作: ContentProvider往通讯录添加联系人和获取联系人