Sian 发表于 2014-8-22 11:27:47

ios获取系统通讯录方法

本帖最后由 Sian 于 2015-4-4 10:38 编辑

       网上相关贴子很多,但基本上都来自同一个出处,基础不好的同学可能看来起会很吃力,我今天整理了一下,化繁为简只提取通讯录中姓名与电话号码,给出最简便的方便供大家参考

       为方便大家调用,我写成了返回数组的方法,直接copy到你的代码中即可取得联系人对象的数组,废话不多说直接上代码吧,数据模型可自定义,只要包含姓名、号码两个成员变量即可,我这里就不粘了,根据需要自定义吧,如有需要可回复

- (NSArray *)getContacts:(ABAddressBookRef)adress{
    // 1、获取通讯录    CFArrayRef results = ABAddressBookCopyArrayOfAllPeople(adress);
    // 2、遍历通讯录    NSMutableArray *array = ;    for (int i = 0; i < CFArrayGetCount(results); i++){
      // 2.1、获取单条记录      ABRecordRef person = CFArrayGetValueAtIndex(results, i);
      // 2.2、取记录中的名字      NSString *firstName = (__bridge NSString*)ABRecordCopyValue(person, kABPersonFirstNameProperty);      NSString *name = (__bridge NSString*)ABRecordCopyValue(person, kABPersonLastNameProperty);      if (firstName) name = ;                     // 名字拼接
      // 2.3、取记录中的号码      ABMultiValueRef phones = ABRecordCopyValue(person, kABPersonPhoneProperty);         // 所有号码      for (int k = 0; k < ABMultiValueGetCount(phones); k++){                           // 遍历取值            NSString * phone = (__bridge NSString*)ABMultiValueCopyValueAtIndex(phones, k); // 取出号码            RMContact *contact = ;            ;                                                      // 加入数组      }    }
    return array;}
红色部分请根据自已的数据模型创建!!方便Copy写成代码块:- (NSArray *)getContacts:(ABAddressBookRef)adress
{

    // 1、获取通讯录
    CFArrayRef results = ABAddressBookCopyArrayOfAllPeople(adress);
   
    // 2、遍历通讯录
    NSMutableArray *array = ;
    for (int i = 0; i < CFArrayGetCount(results); i++){
      
      // 2.1、获取单条记录
      ABRecordRef person = CFArrayGetValueAtIndex(results, i);
      
      // 2.2、取记录中的名字
      NSString *firstName = (__bridge NSString*)ABRecordCopyValue(person, kABPersonFirstNameProperty);
      NSString *name = (__bridge NSString*)ABRecordCopyValue(person, kABPersonLastNameProperty);
      if (firstName) name = ;                     // 名字拼接
      
      // 2.3、取记录中的号码
      ABMultiValueRef phones = ABRecordCopyValue(person, kABPersonPhoneProperty);         // 所有号码
      for (int k = 0; k < ABMultiValueGetCount(phones); k++){                           // 遍历取值
            NSString * phone = (__bridge NSString*)ABMultiValueCopyValueAtIndex(phones, k); // 取出号码
            RMLocalContact *contact = ;
            ;                                                      // 加入数组
      }
    }
    _contacts = ;
   
    return array;
}
**** Hidden Message *****

tyl0123456 发表于 2015-4-2 23:01:15

RMContact。。。请问楼主是什么东东?能发一个看看不

tyl0123456 发表于 2015-4-2 23:08:55

请问楼主,调用- (NSArray *)getContacts:(ABAddressBookRef)adress时;adress我传什么值?本人菜鸟一枚~

Sian 发表于 2015-4-3 10:11:42

tyl0123456 发表于 2015-4-2 23:08
请问楼主,调用- (NSArray *)getContactsABAddressBookRef)adress时;adress我传什么值?本人菜鸟一枚~

创建ABAddressBookRef 对象
ABAddressBookRefaddressBook = ABAddressBookCreateWithOptions(nil, nil);

Sian 发表于 2015-4-3 10:13:57

tyl0123456 发表于 2015-4-2 23:01
RMContact。。。请问楼主是什么东东?能发一个看看不

RMContact只是个数据模型,你可以自己定义
@interface RMContact : NSObject

/**
* 联系人ID
*/
@property (nonatomic ,assign) long contactID;
/**
* 联系方式姓名
*/
@property (nonatomic ,retain) NSString *name;
/**
* 手机
*/
@property (nonatomic ,retain) NSString *cellPhone;

- (id)initWithName:(NSString*)name cellPhone:(NSString*)cellPhone;

+ (id)contactWithName:(NSString*)name cellPhone:(NSString*)cellPhone;
@end

tyl0123456 发表于 2015-4-3 11:05:20

我打断点。    for (int i = 0; i < CFArrayGetCount(results); i++){}   for里边直接不进去呢?楼主能否发个demo。让我mark一下??万分感激~~~

tyl0123456 发表于 2015-4-3 11:06:21

[email protected]谢谢

Sian 发表于 2015-4-4 10:28:46

tyl0123456 发表于 2015-4-3 11:05
我打断点。    for (int i = 0; i < CFArrayGetCount(results); i++){}   for里边直接不进去呢?楼主能否 ...

给你一份完整的代码,Demo也上传在帖子中,供你下载。
//
//SAViewController.m
//Test
//
//Created by yusian on 15-4-4.
//Copyright (c) 2015年 Sian. All rights reserved.
//

#import "SAViewController.h"
#import <AddressBook/AddressBook.h>

@interface SAViewController ()

@end

@implementation SAViewController

- (void)viewDidLoad
{
    ;
    ABAddressBookRef bookRef = ABAddressBookCreateWithOptions(nil, nil);
   
    //获取本地通讯录访问权限
    ABAddressBookRequestAccessWithCompletion(bookRef, ^(bool granted, CFErrorRef error){
      NSArray *array = ;
      NSLog(@"%@", array);
    });
}

- (NSArray *)getContacts:(ABAddressBookRef)adress

{
    // 1、获取通讯录
    CFArrayRef results = ABAddressBookCopyArrayOfAllPeople(adress);

    // 2、遍历通讯录
    NSMutableArray *array = ;
   
    for (int i = 0; i < CFArrayGetCount(results); i++){
      
      // 2.1、获取单条记录
      ABRecordRef person = CFArrayGetValueAtIndex(results, i);
      
      // 2.2、取记录中的名字
      NSString *firstName = (__bridge NSString*)ABRecordCopyValue(person, kABPersonFirstNameProperty);
      NSString *name = (__bridge NSString*)ABRecordCopyValue(person, kABPersonLastNameProperty);
      if (firstName) name = ;                     // 名字拼接
   
      // 2.3、取记录中的号码(可能存在多个)
      ABMultiValueRef phones = ABRecordCopyValue(person, kABPersonPhoneProperty);         // 所有号码
      for (int k = 0; k < ABMultiValueGetCount(phones); k++){                           // 遍历取值
            NSString * phone = (__bridge NSString*)ABMultiValueCopyValueAtIndex(phones, k); // 取出号码
            // 拼接姓名号码,如:(张三:15555555555:18888888888)
            name = ;
      }
      // 添加到数组,强烈建议在此创建一个通讯录的模型来接收数据,将数据保存到数组!
      if (name) ;
    }
    return array;
}

@end

活在梦里丶 发表于 2015-6-26 11:13:20

我来看一看
页: [1]
查看完整版本: ios获取系统通讯录方法