iOS通讯录操作封装(添加联系人、检查号码是否存在)

来源:互联网 发布:剑网三女神脸数据 编辑:程序博客网 时间:2024/04/30 15:37

SJABHelper.h

[html] view plaincopy
  1. #import <Foundation/Foundation.h>  
  2.   
  3. enum {  
  4.     ABHelperCanNotConncetToAddressBook,  
  5.     ABHelperExistSpecificContact,  
  6.     ABHelperNotExistSpecificContact  
  7. };  
  8.   
  9. typedef NSUInteger ABHelperCheckExistResultType;  
  10.   
  11. @interface SJABHelper : NSObject  
  12.   
  13. // 添加联系人  
  14. // name     -> 联系人姓名  
  15. // phoneNum    -> 电话号码  
  16. // label    -> 电话号码的标签备注  
  17. + (BOOL)addContactName:(NSString*)name phoneNum:(NSString*)num withLabel:(NSString*)label;  
  18.   
  19. // 查询指定号码是否已存在于通讯录  
  20. // 返回值:  
  21. //  ABHelperCanNotConncetToAddressBook -> 连接通讯录失败(iOS6之后访问通讯录需要用户许可)  
  22. //  ABHelperExistSpecificContact    -> 号码已存在  
  23. //  ABHelperNotExistSpecificContact  -> 号码不存在  
  24. + (ABHelperCheckExistResultType)existPhone:(NSString*)phoneNum;  
  25.   
  26. @end  

SJABHelper.m

需要引入 AddressBook framework。

[html] view plaincopy
  1. #import "SJABHelper.h"  
  2. #import <AddressBook/AddressBook.h>  
  3.   
  4. @implementation SJABHelper  
  5.   
  6. // 单列模式  
  7. + (SJABHelper*)shareControl  
  8. {  
  9.     static SJABHelper *instance;  
  10.     @synchronized(self) {  
  11.         if(!instance) {  
  12.             instance = [[SJABHelper alloc] init];  
  13.         }  
  14.     }  
  15.     return instance;  
  16. }  
  17.   
  18. + (BOOL)addContactName:(NSString *)name phoneNum:(NSString *)num withLabel:(NSString *)label  
  19. {  
  20.     return [[SJABHelper shareControl] addContactName:name phoneNum:num withLabel:label];  
  21. }  
  22.   
  23. // 添加联系人(联系人名称、号码、号码备注标签)  
  24. - (BOOL)addContactName:(NSString*)name phoneNum:(NSString*)num withLabel:(NSString*)label  
  25. {  
  26.   // 创建一条空的联系人  
  27.     ABRecordRef record = ABPersonCreate();  
  28.     CFErrorRef error;  
  29.   // 设置联系人的名字  
  30.     ABRecordSetValue(record, kABPersonFirstNameProperty, (__bridge CFTypeRef)name, &error);  
  31.     // 添加联系人电话号码以及该号码对应的标签名  
  32.     ABMutableMultiValueRef multi = ABMultiValueCreateMutable(kABPersonPhoneProperty);  
  33.     ABMultiValueAddValueAndLabel(multi, (__bridge CFTypeRef)num, (__bridge CFTypeRef)label, NULL);  
  34.     ABRecordSetValue(record, kABPersonPhoneProperty, multi, &error);  
  35.       
  36.     ABAddressBookRef addressBook = nil;  
  37.   // 如果为iOS6以上系统,需要等待用户确认是否允许访问通讯录。  
  38.     if ([[UIDevice currentDevice].systemVersion floatValue] >= 6.0)  
  39.     {  
  40.         addressBook = ABAddressBookCreateWithOptions(NULL, NULL);  
  41.         //等待同意后向下执行  
  42.         dispatch_semaphore_t sema = dispatch_semaphore_create(0);  
  43.         ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error)  
  44.                                                  {  
  45.                                                      dispatch_semaphore_signal(sema);  
  46.                                                  });  
  47.         dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);   
  48.         dispatch_release(sema);   
  49.     }   
  50.     else   
  51.     {   
  52.         addressBook = ABAddressBookCreate();   
  53.     }  
  54.    // 将新建联系人记录添加如通讯录中  
  55.     BOOL success = ABAddressBookAddRecord(addressBook, record, &error);  
  56.     if (!success) {  
  57.         return NO;  
  58.     }else{  
  59.      // 如果添加记录成功,保存更新到通讯录数据库中  
  60.         success = ABAddressBookSave(addressBook, &error);  
  61.         return success ? YES : NO;  
  62.     }  
  63. }  
  64.   
  65. + (ABHelperCheckExistResultType)existPhone:(NSString *)phoneNum  
  66. {  
  67.     return [[SJABHelper shareControl] existPhone:phoneNum];  
  68. }  
  69.   
  70. // 指定号码是否已经存在  
  71. - (ABHelperCheckExistResultType)existPhone:(NSString*)phoneNum  
  72. {  
  73.     ABAddressBookRef addressBook = nil;  
  74.     if ([[UIDevice currentDevice].systemVersion floatValue] >= 6.0)  
  75.     {  
  76.         addressBook = ABAddressBookCreateWithOptions(NULL, NULL);  
  77.         //等待同意后向下执行  
  78.         dispatch_semaphore_t sema = dispatch_semaphore_create(0);  
  79.         ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error)  
  80.                                                  {  
  81.                                                      dispatch_semaphore_signal(sema);  
  82.                                                  });  
  83.         dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);   
  84.         dispatch_release(sema);   
  85.     }   
  86.     else   
  87.     {   
  88.         addressBook = ABAddressBookCreate();   
  89.     }  
  90.     CFArrayRef records;  
  91.     if (addressBook) {  
  92.      // 获取通讯录中全部联系人  
  93.         records = ABAddressBookCopyArrayOfAllPeople(addressBook);  
  94.     }else{  
  95. #ifdef DEBUG  
  96.         NSLog(@"can not connect to address book");  
  97. #endif  
  98.         return ABHelperCanNotConncetToAddressBook;  
  99.     }  
  100.       
  101.   // 遍历全部联系人,检查是否存在指定号码  
  102.     for (int i=0; i<CFArrayGetCount(records); i++) {  
  103.         ABRecordRef record = CFArrayGetValueAtIndex(records, i);  
  104.         CFTypeRef items = ABRecordCopyValue(record, kABPersonPhoneProperty);  
  105.         CFArrayRef phoneNums = ABMultiValueCopyArrayOfAllValues(items);  
  106.         if (phoneNums) {  
  107.             for (int j=0; j<CFArrayGetCount(phoneNums); j++) {  
  108.                 NSString *phone = (NSString*)CFArrayGetValueAtIndex(phoneNums, j);  
  109.                 if ([phone isEqualToString:phoneNum]) {  
  110.                     return ABHelperExistSpecificContact;  
  111.                 }  
  112.             }  
  113.         }  
  114.     }  
  115.   
  116.     CFRelease(addressBook);  
  117.     return ABHelperNotExistSpecificContact;  
  118. }  
  119.   
  120. @end  

需要注意的就是iOS6中新的用户隐私保护使得调用 ABAddressBookCreate() 时会弹出alert让用户确认是否允许,需要加上代码:

[html] view plaincopy
  1. // 如果为iOS6以上系统,需要等待用户确认是否允许访问通讯录。  
  2.     if ([[UIDevice currentDevice].systemVersion floatValue] >= 6.0)  
  3.     {  
  4.         addressBook = ABAddressBookCreateWithOptions(NULL, NULL);  
  5.         //等待同意后向下执行  
  6.         dispatch_semaphore_t sema = dispatch_semaphore_create(0);  
  7.         ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error)  
  8.                                                  {  
  9.                                                      dispatch_semaphore_signal(sema);  
  10.                                                  });  
  11.         dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);   
  12.         dispatch_release(sema);   
  13.     }  

不然addressBook在用户确认操作前是NULL,调用会导致程序crash。
0 0
原创粉丝点击