IOS中获取本地通讯录联系人以及汉字首字母排序

iOS中获取手机通讯录中的联系人信息:

/*** 加载本地联系人*/
- (void)loadLocalContacts
{
  //新建一个通讯录类
  ABAddressBookRef addressBooks = nil; 

  if (DeviceVersion < 6.0) {
    addressBooks = ABAddressBookCreate();
  } else {
    addressBooks = ABAddressBookCreateWithOptions(NULL, NULL);
    //获取通讯录权限
    dispatch_semaphore_t sema = dispatch_semaphore_create(0);
    ABAddressBookRequestAccessWithCompletion(addressBooks, ^(bool granted, CFErrorRef error){dispatch_semaphore_signal(sema);});
    dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
    dispatch_release(sema);
  } 

  //判断授权状态
  if (ABAddressBookGetAuthorizationStatus()!=kABAuthorizationStatusAuthorized) {
    return ;
  } 

  //获取通讯录中的所有人
  CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople(addressBooks);
  //通讯录中人数
  CFIndex nPeople = ABAddressBookGetPersonCount(addressBooks);
  NSMutableArray *persons = [[NSMutableArray alloc] init];
  for (int i = 0; i < nPeople; i++) {
    //获取个人
    ABRecordRef person = CFArrayGetValueAtIndex(allPeople, i);
    //获取个人名字
    NSString *firstName = (NSString *)ABRecordCopyValue(person, kABPersonFirstNameProperty);
    NSString *lastName = (NSString *)ABRecordCopyValue(person, kABPersonLastNameProperty);
    NSMutableString *name = [[NSMutableString alloc] init];
    if (firstName == nil && lastName == nil) {
      NSLog(@"名字不存在的情况");
      name = nil;
    }
    if (lastName) {
      [name appendString:lastName];
    }
    if (firstName) {
      [name appendString:firstName];
    } 

    ABMultiValueRef tmlphone = ABRecordCopyValue(person, kABPersonPhoneProperty);
    NSString *telphone = (NSString *)ABMultiValueCopyValueAtIndex(tmlphone, 0);
    if (telphone != nil) {
      telphone = [telphone stringByReplacingOccurrencesOfString:@"-" withString:@""];
      NSString *title = [NSString stringWithFormat:@"%@(%@)",name,telphone];
      [persons addObject:title];
    }
  } 

  //对联系人进行分组和排序
  UILocalizedIndexedCollation *theCollation = [UILocalizedIndexedCollation currentCollation];
  NSInteger highSection = [[theCollation sectionTitles] count]; //中文环境下返回的应该是27,是a-z和#,其他语言则不同 

  //_indexArray 是右侧索引的数组,也是secitonHeader的标题
  _indexArray = [[NSMutableArray alloc] initWithArray:[theCollation sectionTitles]]; 

  NSMutableArray *newSectionsArray = [[NSMutableArray alloc] initWithCapacity:highSection];
  //初始化27个空数组加入newSectionsArray
  for (NSInteger index = 0; index < highSection; index++) {
    NSMutableArray *array = [[NSMutableArray alloc] init];
    [newSectionsArray addObject:array];
    [array release];
  } 

  for (NSString *p in persons) {
    //获取name属性的值所在的位置,比如"林丹",首字母是L,在A~Z中排第11(第一位是0),sectionNumber就为11
    NSInteger sectionNumber = [theCollation sectionForObject:p collationStringSelector:@selector(getFirstLetter)];
    //把name为“林丹”的p加入newSectionsArray中的第11个数组中去
    NSMutableArray *sectionNames = newSectionsArray[sectionNumber];
    [sectionNames addObject:p];
  } 

  for (int i = 0; i < newSectionsArray.count; i++) {
    NSMutableArray *sectionNames = newSectionsArray[i];
    if (sectionNames.count == 0) {
      [newSectionsArray removeObjectAtIndex:i];
      [_indexArray removeObjectAtIndex:i];
      i--;
    }
  } 

  //_contacts 是联系人数组(确切的说是二维数组)
  self.contacts = newSectionsArray;
  [newSectionsArray release]; 

  [self.tableView reloadData];
}

顺便把索引和tableView dataSource的代理方法也贴一下:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
  return self.contacts.count;
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
  return [self.contacts[section] count];
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
  static NSString *identifier = @"contactCell";
  UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
  if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];
  } 

  cell.imageView.image = [UIImage imageNamed:@"default_head"];
  cell.textLabel.text = [self.contacts objectAtIndex:indexPath.section][indexPath.row];
  return cell;
} 

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
  return [_indexArray objectAtIndex:section];
} 

- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView
{
  return _indexArray;
} 

//索引列点击事件
- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index
{
  return index;
}

还有两个很重要的方法:

下面这个方法是[theCollation sectionForObject:p collationStringSelector:@selector(getFirstLetter)]; 是这里的p对象要实现的方法,我这里的p是NSString,你也可以用其他对象例如Person。

 NSString *ret = @"";
  if (![self canBeConvertedToEncoding: NSASCIIStringEncoding]) {//如果是英语
    if ([[self letters] length]>2) {
      ret = [[self letters] substringToIndex:1];
    }
  }
  else {
    ret = [NSString stringWithFormat:@"%c",[self characterAtIndex:0]];
  }
  return ret;
}

下面这个方法是NSString得类别方法

- (NSString *)letters{
  NSMutableString *letterString = [NSMutableString string];
  int len = [self length];
  for (int i = 0;i < len;i++)
  {
    NSString *oneChar = [[self substringFromIndex:i] substringToIndex:1];
    if (![oneChar canBeConvertedToEncoding:NSASCIIStringEncoding]) {
      NSArray *temA = makePinYin2([oneChar characterAtIndex:0]);
      if ([temA count]>0) {
        oneChar = [temA objectAtIndex:0];
      }
    }
    [letterString appendString:oneChar];
  }
  return letterString;
}

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

时间: 2016-12-14

iOS开发中使app获取本机通讯录的实现代码实例

一.在工程中添加AddressBook.framework和AddressBookUI.framework 二.获取通讯录 1.在infterface中定义数组并在init方法中初始化 复制代码 代码如下: NSMutableArray *addressBookTemp;   - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {     addressBookTemp = [NSMut

IOS 通讯录信息读取兼容的实现方法

IOS 通讯录信息读取兼容的实现方法 项目中有一个功能需要读取通讯录中联系人的手机.在iOS8以前都是可用的,主要使用如下三个代理方法来实现 - (void) peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)peoplePicker - (BOOL) peoplePickerNavigationController:(ABPeoplePickerNavigationController

iOS实现封装一个获取通讯录的工具类详解

前言 本文给大家介绍了关于iOS如何封装一个获取通讯录工具类的相关内容,iOS获取通讯录一共有4个framework: AddressBook, AddressBookUI, Contacts, ContactsUI; 其中 AddressBook 和 AddressBookUI 已经被iOS9时 deprecated 了, 而推出了Contacts 和 ContactsUI 取代之. 其中 AddressBookUI 和 ContactsUI 是picker出一个界面提供选择一条联系人信息并且

IOS 通讯录的访问和修改的实现

IOS 通讯录的访问和修改的实现 在iOS端可以通过AddressBook或者AddressBookUI两个框架实现,区别是第二个框架带视图,一般使用第一个框架就够了. 下面介绍AddressBook框架的使用,注意这个是C语言框架,使用起来比较麻烦. ①请求授权 先判断授权状态,如果未授权则进行授权. // 1.主动请求授权,先判断授权状态 NSInteger state = ABAddressBookGetAuthorizationStatus(); if (state == kABAuth

详解iOS获取通讯录的4种方式

本文实例为大家分享了iOS获取通讯录的4种方式,供大家参考,具体内容如下 使用场景 一些App通过手机号码来推荐好友,如 微博.支付宝 首先客户端会获取通讯录中的所有手机号然后将这些手机号提交到App服务器中,服务器会查找每个手机号对应的App账号如QQ号码返回到客户端,然后客户端根据服务器返回的账号列表来推荐好友. 获取联系人方式 方案一:AddressBookUI.framework框架 提供了联系人列表界面.联系人详情界面.添加联系人界面等 一般用于选择联系人 方案二:AddressBoo

如何自定义iOS通讯录

苹果给用户提供了自己的通讯录,但是根据业务的需求,需要自定义通讯录,我们就需要根据业务需求来自定义. 首先我们需要知道苹果的提供的一些Foundation.UIKit框架,了解其中的一些特性,可以打开手机查看苹果系统提供的原生的通讯录,可以看到: 1.搜索框 2.右侧搜索条 3.联系人分组 4.添加联系人 5.获取联系人头像及联系方式 根据需求,可以总结出自定义通讯录需要做的一些功能,一项大的功能可以差分成一些小的功能,然后一个一个实现,将复杂的问题差分成小问题解决. 1.自定义搜索框 2.获取

iOS获取手机通讯录方式方法(最新)

最近学习了iOS获取手机通讯录方式方法,现在分享给大家.希望此文章对各位有所帮助. 一.iOS 9 以前的通讯录框架 AddressBookUI框架:提供了联系人列表界面.联系人详情界面.添加联系人界面等,一般用于选择联系人. AddressBook 框架:纯 C 语言的 API,仅仅是获得联系人数据.没有提供 UI 界面展示,需要自己搭建联系人展示界面. 二. iOS 9 以后最新通讯录框架 ContactsUI 框架:拥有 AddressBookUI 框架的所有功能,使用起来更加的面向对象.

Android获取手机通讯录、sim卡联系人及调用拨号界面方法

android获取手机通讯录联系人信息 复制代码 代码如下: private void getPhoneContacts() {        ContentResolver resolver = this.getContentResolver();                // 获取手机联系人       Cursor phoneCursor = resolver.query(Phone.CONTENT_URI,                  new String[] { Phone

Android使用ContentResolver搜索手机通讯录的方法

本文实例讲述了Android使用ContentResolver搜索手机通讯录的方法.分享给大家供大家参考,具体如下: 在这个程序中使用ContentResolver来访问通讯录里联系人的关键字,并将所有找到的联系人存入CursorAdapter里.输入搜索人员名字a ,会将所有以a开头的名字都显示出来,输入*,则所有通讯录中的人名显示于AutoCompleteView的AdapterView里,若发生了User选择事件后,会将勾选的联系人电话号码显示于TextView里. 此程序中用到了Cont

iOS获取手机ip地址代码

本文实例为大家分享了iOS获取手机ip地址的具体代码,供大家参考,具体内容如下 #import <ifaddrs.h> #import <arpa/inet.h> // Get IP Address - (NSString *)getIPAddress { NSString *address = @"error"; struct ifaddrs *interfaces = NULL; struct ifaddrs *temp_addr = NULL; int s

Android编程操作手机通讯录的方法示例

本文实例讲述了Android编程操作手机通讯录的方法.分享给大家供大家参考,具体如下: 手机通讯录的操作是经常被用到的,例如添加联系人,删除联系人或者取得联系人信息.类似的操作还有收藏夹的操作,下面就针对通讯录的操作来做个小例子.同样的这次也会使用到内容提供者的知识. 1. 要操作通信录就要得到授权,也就是读或者写通讯录的权力.这里也需要使用Junit <?xml version="1.0" encoding="utf-8"?> <manifest

微信小程序获取手机系统信息的方法【附源码下载】

本文实例讲述了微信小程序获取手机系统信息的方法.分享给大家供大家参考,具体如下: 1.效果展示 2.关键代码 index.wxml布局文件代码 <view>手机型号:{{mobileModel}}</view> <view>手机像素比:{{mobileePixelRatio}}</view> <view>窗口宽度:{{windowWidth}}</view> <view>窗口高度:{{windowHeight}}</

Android获取手机联系人的方法

Android 获取系统联系人信息的实例 一.获取手机联系人姓名及手机号 //跳转到系统联系人应用 Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI); try { startActivityForResult(intent, Contacts1RequestCode); } catch (Exception e) { LogManager.e("打开联系人信息失败"

iOS获取网络类型的方法汇总

Reachability类只能区分WIFI和WWAN类型,却无法区分2G网和3G网. 网上也有些方法,却都存在Bug. 经过网上查找资料和测试,基本上总结了以下几种方法: 1.使用导航栏的方式:(私有API) 代码: 复制代码 代码如下: typedef enum {     NetWorkType_None = 0,     NetWorkType_WIFI,     NetWorkType_2G,     NetWorkType_3G, } NetWorkType; UIApplicatio

Android Loader的使用以及手机通讯录的获取方法

Android的主线程中执行长时间操作,导致界面无响应,会引起ANR.如果需要执行较长时间的操作,一般会在另一个线程处理,然后将数据转交给主线程进行显示,Android本身为我们提供了一些机制处理这种情况,今天就来看看Loader.Loader主要用来在Activity和Fragment中异步加载数据,使用也非常简单. Loader的初始化非常简单,Activity提供了获取LoaderManager的接口,之后调用LoaderManager的initLoader即可.initLoader接受三

iOS如何获取手机的Mac地址

首先说明下,下面两种方法均可以获得手机的mac地址,但是有个限制,是在iOS7以下才可以获得.iOS7以后苹果对于sysctl和ioctl进行了技术处理,MAC地址返回的都是02:00:00:00:00:00. 官方文档上这样写的: "Twolow-level networking APIs that used to return a MAC address now return thefixed value 02:00:00:00:00:00. The APIs in question are