1. #import <Foundation/Foundation.h>
  2.  
  3. @interface LoadingContactData : NSObject
  4.  
  5. // 读取通讯录
  6. + (LoadingContactData *)shareIntance;
  7.  
  8. - (void)getContactData;
  9.  
  10. @end
  11.  
  12. #import "LoadingContactData.h"
  13.  
  14. static LoadingContactData *_contactData;
  15.  
  16. @implementation LoadingContactData
  17.  
  18. + (LoadingContactData *)shareIntance
  19. {
  20. if (_contactData == nil) {
  21. _contactData = [[LoadingContactData alloc]init];
  22. }
  23. return _contactData;
  24. }
  25.  
  26. - (void)getContactData
  27. {
  28. CFErrorRef error = NULL;
  29.  
  30. ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, &error);
  31. if (addressBook) {
  32. NSArray *allContacts = (__bridge_transfer NSArray*)ABAddressBookCopyArrayOfAllPeople(addressBook);
  33. NSMutableArray *contactsArray = [NSMutableArray new];
  34.  
  35. for (NSUInteger i = ; i<[allContacts count]; i++)
  36. {
  37. ABRecordRef contactPerson = (__bridge ABRecordRef)allContacts[i];
  38.  
  39. // Get mobile number
  40. ABMultiValueRef phonesRef = ABRecordCopyValue(contactPerson, kABPersonPhoneProperty);
  41. NSMutableArray *telephoneArray = [self getMobilePhoneProperty:phonesRef];
  42.  
  43. [telephoneArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
  44.  
  45. THContact *contact = [[THContact alloc] init];
  46.  
  47. // Get first and last names and fullName
  48. NSString *firstName = (__bridge_transfer NSString*)ABRecordCopyValue(contactPerson, kABPersonFirstNameProperty);
  49. NSString *lastName = (__bridge_transfer NSString*)ABRecordCopyValue(contactPerson, kABPersonLastNameProperty);
  50. NSString *fullName = (__bridge_transfer NSString *)ABRecordCopyCompositeName(contactPerson);
  51.  
  52. // Set Contact properties
  53. contact.firstName = firstName;
  54. contact.lastName = lastName;
  55.  
  56. if (fullName != nil){
  57. contact.fullName = fullName;
  58. }
  59. else if(firstName != nil && lastName != nil) {
  60. contact.fullName = [NSString stringWithFormat:@"%@%@",lastName,firstName];
  61. } else if (firstName != nil) {
  62. contact.fullName = firstName;
  63. } else if (lastName != nil) {
  64. contact.fullName = lastName;
  65. } else {
  66. contact.fullName = @"";
  67. }
  68.  
  69. // Get image if it exists
  70. NSData * imgData = (__bridge_transfer NSData *)ABPersonCopyImageDataWithFormat(contactPerson,kABPersonImageFormatThumbnail); // 联系人头像(裁剪后的)
  71. //NSData *imgData = (__bridge_transfer NSData *)ABPersonCopyImageData(contactPerson); // 联系人头像原图
  72. UIImage *userImg = [UIImage imageWithData:imgData];
  73. contact.image = userImg;
  74.  
  75. if (!contact.image) {
  76. contact.image = MF_PngWithSkin(DEFAULTS_SKIN, @"icon-avatar.png");
  77. }
  78.  
  79. contact.phone = [obj telephoneWithReformat];
  80.  
  81. if ([Unity validateMobile:contact.phone]) {
  82. contact.recordId = ABRecordGetRecordID(contactPerson)+ [[contact.phone substringWithRange:NSMakeRange(, )] integerValue]+idx;
  83. [contactsArray addObject:contact];
  84. }
  85.  
  86. }];
  87.  
  88. if(phonesRef) {
  89. CFRelease(phonesRef);
  90. }
  91.  
  92. }
  93.  
  94. [[ContactDataArray shareContactData] setContactDataArray:contactsArray];
  95.  
  96. if(addressBook) {
  97. CFRelease(addressBook);
  98. }
  99. }
  100. else
  101. {
  102. NSLog(@"Error");
  103.  
  104. }
  105. }
  106.  
  107. - (NSMutableArray *)getMobilePhoneProperty:(ABMultiValueRef)phonesRef
  108. {
  109. NSMutableArray *dataArray = [[NSMutableArray alloc]init];
  110. for (int i=; i < ABMultiValueGetCount(phonesRef); i++) {
  111.  
  112. CFStringRef currentPhoneValue = ABMultiValueCopyValueAtIndex(phonesRef, i);
  113. NSString *phone = (__bridge NSString *)currentPhoneValue;
  114. [dataArray addObject:phone];
  115. }
  116.  
  117. return dataArray;
  118. }
  119.  
  120. @end

ios 读取通讯录数据的更多相关文章

  1. ios读取通讯录信息

    ios读取通讯录信息 (2012-05-22 14:07:11) 标签: ios读取通讯录 it   iphone如许app读取通讯录信息,读取通讯录信息时需要加载AddressBookUI 和Add ...

  2. 利用AddressBook.framework框架获取iOS系统通讯录数据

    此方法是使用AddressBook.framework框架获取通讯录信息 第一步.在info.plist文件里面配置访问权限 第二步.导入头文件 #import <AddressBook/Add ...

  3. iOS访问通讯录开发-读取联系人信息

    读取通信录中的联系人一般的过程是先查找联系人记录,然后再访问记录的属性,属性又可以分为单值属性和多值属性.通过下面例子介绍联系人的查询,以及单值属性和多值属性的访问,还有读取联系人中的图片数据. 本案 ...

  4. ios 向sqlite数据库插入和读取图片数据

    向sqlite数据库插入和读取图片数据 (for ios) 假定数据库中存在表 test_table(name,image), 下面代码将图片文件test.png的二进制数据写到sqlite数据库: ...

  5. iOS彩票项目--第七天,初次读取json数据、KVC转模型技巧、运行时字典转模型以及初步对显示网页的操作并且跟踪标签

    一.初次读取json数据 二.KVC转模型技巧,这里的技巧主要解决的是字典中的key 与 模型中有的属性对应不起来的时候 的解决办法 <方法1> <方法2>运行时字典转模型,运 ...

  6. iOS 获得通讯录中联系人的所有属性--b

    ABAddressBookRef addressBook = ABAddressBookCreate(); CFArrayRef results = ABAddressBookCopyArrayOfA ...

  7. iOS有关通讯录操作

    一.首先获取用户通讯录授权信息. 在AppDelegate中导入#import <AddressBook/AddressBook.h>框架,在下列方法中获取授权信息. - (BOOL)ap ...

  8. iOS开发系列--数据存取

    概览 在iOS开发中数据存储的方式可以归纳为两类:一类是存储为文件,另一类是存储到数据库.例如前面IOS开发系列-Objective-C之Foundation框架的文章中提到归档.plist文件存储, ...

  9. iOS - OC PList 数据存储

    前言 直接将数据写在代码里面,不是一种合理的做法.如果数据经常改,就要经常翻开对应的代码进行修改,造成代码扩展性低.因此,可以考虑将经常变的数据放在文件中进行存储,程序启动后从文件中读取最新的数据.如 ...

随机推荐

  1. Javascript:作用域 学习总结

    作用域(scope): 变量与函数的可访问范围,控制着变量与函数的可见性和生命周期   作用域分类: javascript中,变量的作用域分为:全局作用域,局部作用域 局部变量的优先级大于全局变量,或 ...

  2. Linux环境下Eclipse + Tomcat + MySQL 配置J2EE开发环境的方法

    1. 版本号信息 (1)CentOS 6.4发行版64位,uname -a 显演示样例如以下: Linux localhost.localdomain 3.11.6 #1 SMP Sat Nov 2 ...

  3. 绘制更Smooth的UI

    以前很长一段时间,在自定义控制绘制时,只是简单的定义一个QPainter对象而开始绘画.经常会画一些圆角矩形,甚至是一些不规则的图形.对于不规则的图形来说,如果PS技术不好,或者mask制作的不好,常 ...

  4. Gunplot 命令大全

    在linux命令提示符下运行gnuplot命令启动,输入quit或q或exit退出. plot命令 gnuplot> plot sin(x) with line linetype 3 linew ...

  5. QT正则表达式---针对IP地址

    判断合法IP的QT正则表达式: bool IsIPaddress(QString ip) { QRegExp rx2("(//d+)(//.)(//d+)(//.)(//d+)(//.)(/ ...

  6. Ubuntu 12.04设置打开远程桌面登录1

    teamviewer_linux.deb sudo dpkg --install teamviewer_linux.deb

  7. .net的WebForm模拟MVC进行模型绑定,让自己少操劳

    一.前言 用过MVC的兄弟们都知道,MVC有模型绑定表单提交的数据功能,那么我也想偷个懒也写个WebForm版的模型绑定.这里主要定义一个泛型方法,然后通过反射把表单上对应属性名字的值赋值到反射创建类 ...

  8. Linq 关键字

    from var lowNums = from num in numbers            where num < 5            select num; numbers 是数 ...

  9. winPcap_2_编译环境*注意*

    使用WinPcap编程 创建一个使用 wpcap.dll 的应用程序 用 Microsoft Visual C++ 创建一个使用 wpcap.dll 的应用程序,需要按以下步骤: 在每一个使用了库的源 ...

  10. 用phpMyAdmin修改mysql数据库密码

    1初始数据库密码为空. 2第一步,点击phpMyAdmin里的用户选项. 3选择root localhost用户名,点击编辑权限. 4此时会出来修改权限的页面,里面可以设置的选项还是比较多的,暂时不管 ...