年年有"余"

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 8587|回复: 8

ios获取系统通讯录方法

[复制链接]
  • TA的每日心情

    2024-10-15 10:05
  • 签到天数: 372 天

    [LV.9]以坛为家II

    发表于 2014-8-22 11:27:47 | 显示全部楼层 |阅读模式
    本帖最后由 Sian 于 2015-4-4 10:38 编辑

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

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

    - (NSArray *)getContacts:(ABAddressBookRef)adress
    {

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

        // 2、遍历通讯录
        NSMutableArray *array = [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 = [name stringByAppendingString:firstName];                     // 名字拼接

            // 2.3、取记录中的号码
            ABMultiValueRef phones = ABRecordCopyValue(person, kABPersonPhoneProperty);         // 所有号码
            for (int k = 0; k < ABMultiValueGetCount(phones); k++){                             // 遍历取值
                NSString * phone = (__bridge NSString*)ABMultiValueCopyValueAtIndex(phones, k); // 取出号码
                RMContact *contact = [RMContact contactWithName:name phone:phone];
                [array addObject:contact];                                                      // 加入数组
            }
        }

        return array;
    }

    红色部分请根据自已的数据模型创建!!
    方便Copy写成代码块:
    [Objective-C] 纯文本查看 复制代码
    - (NSArray *)getContacts:(ABAddressBookRef)adress
    {
    
        // 1、获取通讯录
        CFArrayRef results = ABAddressBookCopyArrayOfAllPeople(adress);
        
        // 2、遍历通讯录
        NSMutableArray *array = [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 = [name stringByAppendingString:firstName];                     // 名字拼接
            
            // 2.3、取记录中的号码
            ABMultiValueRef phones = ABRecordCopyValue(person, kABPersonPhoneProperty);         // 所有号码
            for (int k = 0; k < ABMultiValueGetCount(phones); k++){                             // 遍历取值
                NSString * phone = (__bridge NSString*)ABMultiValueCopyValueAtIndex(phones, k); // 取出号码
                RMLocalContact *contact = [RMLocalContact contactWithName:name phone:phone];
                [array addObject:contact];                                                      // 加入数组
            }
        }
        _contacts = [NSArray arrayWithArray:array];
        
        return array;
    }

    游客,如果您要查看本帖隐藏内容请回复

    该用户从未签到

    发表于 2015-4-2 23:01:15 | 显示全部楼层
    RMContact。。。请问楼主是什么东东?能发一个看看不

    该用户从未签到

    发表于 2015-4-2 23:08:55 | 显示全部楼层
    请问楼主,调用- (NSArray *)getContacts:(ABAddressBookRef)adress时;adress我传什么值?本人菜鸟一枚~
  • TA的每日心情

    2024-10-15 10:05
  • 签到天数: 372 天

    [LV.9]以坛为家II

     楼主| 发表于 2015-4-3 10:11:42 | 显示全部楼层
    tyl0123456 发表于 2015-4-2 23:08
    请问楼主,调用- (NSArray *)getContactsABAddressBookRef)adress时;adress我传什么值?本人菜鸟一枚~

    创建ABAddressBookRef 对象
    ABAddressBookRef  addressBook = ABAddressBookCreateWithOptions(nil, nil);
  • TA的每日心情

    2024-10-15 10:05
  • 签到天数: 372 天

    [LV.9]以坛为家II

     楼主| 发表于 2015-4-3 10:13:57 | 显示全部楼层
    tyl0123456 发表于 2015-4-2 23:01
    RMContact。。。请问楼主是什么东东?能发一个看看不

    RMContact只是个数据模型,你可以自己定义
    [Objective-C] 纯文本查看 复制代码
    @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

    该用户从未签到

    发表于 2015-4-3 11:05:20 | 显示全部楼层
    我打断点。    for (int i = 0; i < CFArrayGetCount(results); i++){}   for里边直接不进去呢?楼主能否发个demo。让我mark一下??万分感激~~~

    该用户从未签到

    发表于 2015-4-3 11:06:21 | 显示全部楼层
    673715699@qq.com  谢谢
  • TA的每日心情

    2024-10-15 10:05
  • 签到天数: 372 天

    [LV.9]以坛为家II

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

    给你一份完整的代码,Demo也上传在帖子中,供你下载。
    [Objective-C] 纯文本查看 复制代码
    //
    //  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
    {
        [super viewDidLoad];
        ABAddressBookRef bookRef = ABAddressBookCreateWithOptions(nil, nil);
        
        //获取本地通讯录访问权限
        ABAddressBookRequestAccessWithCompletion(bookRef, ^(bool granted, CFErrorRef error){
            NSArray *array = [self getContacts:bookRef];
            NSLog(@"%@", array);
        });
    }
    
    - (NSArray *)getContacts:(ABAddressBookRef)adress
    
    {
        // 1、获取通讯录
        CFArrayRef results = ABAddressBookCopyArrayOfAllPeople(adress);
    
        // 2、遍历通讯录
        NSMutableArray *array = [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 = [name stringByAppendingString:firstName];                     // 名字拼接
       
            // 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 = [name stringByAppendingFormat:@":%@", phone];
            }
            // 添加到数组,强烈建议在此创建一个通讯录的模型来接收数据,将数据保存到数组!
            if (name) [array addObject:name];
        }
        return array;
    }
    
    @end
  • TA的每日心情
    犯困
    2015-1-11 14:36
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    发表于 2015-6-26 11:13:20 | 显示全部楼层
    我来看一看
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    手机版|小黑屋|Archiver|iOS开发笔记 ( 湘ICP备14010846号 )

    GMT+8, 2024-11-24 08:14 , Processed in 0.051818 second(s), 23 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表