iOS-AddressBook

  • ABAddressBookRef:代表通讯录对象,通过该对象开发人员不用过多的关注通讯录的存储方式,可以直接以透明的方式去访问、保存(在使用AddressBook.framework操作联系人时,所有的增加、删除、修改后都必须执行保存操作,类似于Core Data)等。
  • ABRecordRef:代表一个通用的记录对象,可以是一条联系人信息,也可以是一个群组,可以通过ABRecordGetRecordType()函数获得具体类型。如果作为联系人(事实上也经常使用它作为联系人),那么这个记录记录了一个完整的联系人信息(姓名、性别、电话、邮件等),每条记录都有一个唯一的ID标示这条记录(可以通过ABRecordGetRecordID()函数获得)。
  • ABPersonRef:代表联系人信息,很少直接使用,实际开发过程中通常会使用类型为“kABPersonType”的ABRecordRef来表示联系人(由此可见ABPersonRef其实是一种类型为“kABPersonType”的ABRecordRef)
  • ABGroupRef:代表群组,与ABPersonRef类似,很少直接使用ABGroupRef,而是使用类型为“kABGroupType”的ABRecordRef来表示群组,一个群组可以包含多个联系人,一个联系人也同样可以多个群组。
  • ABPersonCreate():创建一个类型为“kABPersonType”的ABRecordRef。
  • ABRecordCopyValue():取得指定属性的值。
  • ABRecordCopyCompositeName():取得联系人(或群组)的复合信息(对于联系人则包括:姓、名、公司等信息,对于群组则返回组名称)。
  • ABRecordSetValue():设置ABRecordRef的属性值。注意在设置ABRecordRef的值时又分为单值属性和多值属性:单值属性设置只要通过ABRecordSetValue()方法指定属性名和值即可;多值属性则要先通过创建一个
  • ABMutableMultiValueRef类型的变量,然后通过ABMultiValueAddValueAndLabel()方法依次添加属性值,最后通过ABRecordSetValue()方法将ABMutableMultiValueRef类型的变量设置为记录值。
  • ABRecordRemoveValue():删除指定的属性值。

访问通讯录代码:

//
//  WJAddressBookManager.h
//  iOS通讯录
//
//  Created by 幻想无极(谭启宏) on 16/8/18.
//  Copyright © 2016年 幻想无极(谭启宏). All rights reserved.
//

#import 

@interface WJAddressBookModel : NSObject

@property (nonatomic,copy)NSString *firstName; //名
@property (nonatomic,copy)NSString *lastName;  //姓
@property (nonatomic,copy)NSArray *phoneNumbers;//电话号码(可能有多条手机号)
@end

typedef void (^personArrayBlock)(NSArray * array);

/**通讯录管理类*/
@interface WJAddressBookManager : NSObject

-(void)requestAddressBookWithArray:(personArrayBlock)array;

@end
//
//  WJAddressBookManager.m
//  iOS通讯录
//
//  Created by 幻想无极(谭启宏) on 16/8/18.
//  Copyright © 2016年 幻想无极(谭启宏). All rights reserved.
//

#import "WJAddressBookManager.h"
#import 

@implementation WJAddressBookModel

@end

@interface WJAddressBookManager ()

@property (assign,nonatomic) ABAddressBookRef addressBook;//通讯录
@property (strong,nonatomic) NSMutableArray *allPerson;//通讯录所有人员

@end

@implementation WJAddressBookManager

#pragma mark - 私有方法
/**
 *  请求访问通讯录
 */
-(void)requestAddressBookWithArray:(personArrayBlock)array {
    //创建通讯录对象
    self.addressBook = ABAddressBookCreateWithOptions(NULL, NULL);
    
    //请求访问用户通讯录,注意无论成功与否block都会调用
    ABAddressBookRequestAccessWithCompletion(self.addressBook, ^(bool granted, CFErrorRef error) {
        if (!granted) {
            NSLog(@"未获得通讯录访问权限!");
        }
        [self initAllPersonArray:array];
        
    });
}

/**
 *  取得所有通讯录记录
 */
-(void)initAllPersonArray:(personArrayBlock)array {
    //取得通讯录访问授权
    ABAuthorizationStatus authorization= ABAddressBookGetAuthorizationStatus();
    //如果未获得授权
    if (authorization!=kABAuthorizationStatusAuthorized) {
        NSLog(@"尚未获得通讯录访问授权!");
        return ;
    }
    //取得通讯录中所有人员记录
    CFArrayRef allPeople= ABAddressBookCopyArrayOfAllPeople(self.addressBook);
    self.allPerson=(__bridge NSMutableArray *)allPeople;
    
    array([self getPersonListArray]);
    //释放资源
    CFRelease(allPeople);
    
}

- (NSArray *)getPersonListArray {
   NSMutableArray *array = [NSMutableArray array];
    for (int i = 0; i < self.allPerson.count; i++) {
        ABRecordRef recordRef=(__bridge ABRecordRef)self.allPerson[i];
        //取得记录中得信息
        NSString *firstName=(__bridge NSString *) ABRecordCopyValue(recordRef, kABPersonFirstNameProperty);//注意这里进行了强转,不用自己释放资源
        NSString *lastName=(__bridge NSString *)ABRecordCopyValue(recordRef, kABPersonLastNameProperty);
        
        ABMultiValueRef phoneNumbersRef= ABRecordCopyValue(recordRef, kABPersonPhoneProperty);//获取手机号,注意手机号是ABMultiValueRef类,有可能有多条
        NSArray *phoneNumbers=(__bridge NSArray *)ABMultiValueCopyArrayOfAllValues(phoneNumbersRef);//取得CFArraryRef类型的手机记录并转化为NSArrary
        //        long count= ABMultiValueGetCount(phoneNumbersRef);
        //            for(int i=0;i

你可能感兴趣的:(iOS-AddressBook)