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

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

在iOS端可以通过AddressBook或者AddressBookUI两个框架实现,区别是第二个框架带视图,一般使用第一个框架就够了。
下面介绍AddressBook框架的使用,注意这个是C语言框架,使用起来比较麻烦。

①请求授权

先判断授权状态,如果未授权则进行授权。

// 1.主动请求授权,先判断授权状态
NSInteger state = ABAddressBookGetAuthorizationStatus();
if (state == kABAuthorizationStatusAuthorized) {
  NSLog(@"已经授权");
}else{
  ABAddressBookRef book = ABAddressBookCreateWithOptions(NULL, NULL);
  ABAddressBookRequestAccessWithCompletion(book, ^(bool granted, CFErrorRef error) {
    if (granted) {
      NSLog(@"授权成功");
    }else{
      NSLog(@"授权失败");
    }
  });
}

②获取通讯录的联系人

c语言没有对象,通过一些以Ref结尾的指针来获取数据。

注意C语言数组的规模通过函数获取,拿到元素也要通过函数。

注意一些枚举值以k开头。

注意电话是一个数组。

// 先判断授权状态
if (ABAddressBookGetAuthorizationStatus() != kABAuthorizationStatusAuthorized) {
  NSLog(@"未授权");
  return;
} 

ABAddressBookRef book = ABAddressBookCreateWithOptions(NULL, NULL);
CFArrayRef persons = ABAddressBookCopyArrayOfAllPeople(book);
CFIndex count = CFArrayGetCount(persons);
for (NSInteger i = 0; i < count; i++) {
  ABRecordRef person = CFArrayGetValueAtIndex(persons, i);
  CFStringRef lastName = ABRecordCopyValue(person, kABPersonLastNameProperty);
  CFStringRef firstName = ABRecordCopyValue(person, kABPersonFirstNameProperty);
  ABMutableMultiValueRef phones = ABRecordCopyValue(person, kABPersonPhoneProperty);
  NSLog(@"联系人:%@ %@",lastName,firstName);
  NSInteger cnt = ABMultiValueGetCount(phones);
  for (int j = 0; j < cnt; j++) {
    CFStringRef phone = ABMultiValueCopyValueAtIndex(phones, j);
    NSLog(@"电话:%@ ",phone);
  }
}

③修改通讯录联系人

首先拿到通讯录中的人,然后调用SetValue方法来修改值。

最后不要忘记保存。

// 先判断授权状态
if (ABAddressBookGetAuthorizationStatus() != kABAuthorizationStatusAuthorized) {
  NSLog(@"未授权");
  return;
} 

ABAddressBookRef book = ABAddressBookCreateWithOptions(NULL, NULL);
CFArrayRef persons = ABAddressBookCopyArrayOfAllPeople(book);
ABRecordRef person = CFArrayGetValueAtIndex(persons, 0);
ABRecordSetValue(person, kABPersonLastNameProperty, @"changed", NULL);
ABAddressBookSave(book, NULL);

④添加一个联系人

注意添加电话时应创建MultiValue。

// 先判断授权状态
if (ABAddressBookGetAuthorizationStatus() != kABAuthorizationStatusAuthorized) {
  NSLog(@"未授权");
  return;
} 

ABAddressBookRef book = ABAddressBookCreateWithOptions(NULL, NULL);
CFArrayRef persons = ABAddressBookCopyArrayOfAllPeople(book);
CFIndex count = CFArrayGetCount(persons);
for (NSInteger i = 0; i < count; i++) {
  ABRecordRef person = CFArrayGetValueAtIndex(persons, i);
  CFStringRef lastName = ABRecordCopyValue(person, kABPersonLastNameProperty);
  CFStringRef firstName = ABRecordCopyValue(person, kABPersonFirstNameProperty);
  ABMutableMultiValueRef phones = ABRecordCopyValue(person, kABPersonPhoneProperty);
  NSLog(@"联系人:%@ %@",lastName,firstName);
  NSInteger cnt = ABMultiValueGetCount(phones);
  for (int j = 0; j < cnt; j++) {
    CFStringRef phone = ABMultiValueCopyValueAtIndex(phones, j);
    NSLog(@"电话:%@ ",phone);
  }
}

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

(0)

相关推荐

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

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

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

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

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

    iOS中获取手机通讯录中的联系人信息: /*** 加载本地联系人*/ - (void)loadLocalContacts { //新建一个通讯录类 ABAddressBookRef addressBooks = nil; if (DeviceVersion < 6.0) { addressBooks = ABAddressBookCreate(); } else { addressBooks = ABAddressBookCreateWithOptions(NULL, NULL); //获取通讯

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

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

  • 如何自定义iOS通讯录

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

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

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

  • 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中 UIActionSheet字体的修改

    一,效果图. 二,代码. RootViewController.h #import <UIKit/UIKit.h> @interface RootViewController : UIViewController <UIActionSheetDelegate> @end RootViewController.m -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { UIActionSheet *actio

  • 使用golang获取linux上文件的访问/创建/修改时间

    在linux上想获取文件的元信息,我们需要使用系统调用lstat或者stat. 在golang的os包里已经把stat封装成了Stat函数,使用它比使用syscall要方便不少. 这是os.Stat的原型: func Stat(name string) (FileInfo, error)     Stat returns a FileInfo describing the named file. If there is an error, it     will be of type *Path

  • Python的代理类实现,控制访问和修改属性的权限你都了解吗

    目录 本篇文章主要内容 代理类的一个简单的实现方式示例 一个实现日志输出的代理类的简化示例 总结 本篇文章主要内容 代理类主要功能是将一个类实例的属性访问和控制代理到代码内部另外一个实例类,将想对外公布的属性的访问和控制权交给代理类来操作,保留不想对外公布的属性的访问或控制权,比如只读访问,日志功能 1.代理类实现被代理类的属性访问和修改权限控制 2.异常捕获代理类的简化示例 代理类的一个简单的实现方式示例 目标:实现类Product的实例属性让另一个类Proxy来代理访问和控制,想将对外公布的

  • Python3通过字符串访问和修改局部变量的方法实例

    目录 技术背景 读取和修改局部变量 读取和修改全局变量 读取和修改成员变量 总结概要 参考链接 技术背景 在Python中定义一个函数时,就会把变量空间划分为全局变量(global)与局部变量(local),如果是定义在一个类的成员函数中,那么就还有额外的成员变量(self)空间.那么,如果在实际操作中,想把这几种不同的变量空间做一个分离的话,有没有办法呢? 读取和修改局部变量 首先来看一下局部变量的读取,一般有locals().vars()和sys._getframe(0).f_code.co

  • iOS 9无法访问HTTP的解决方法

    在iOS 9之后,苹果默认要求App访问的url必须为https的安全链接,http链接确实是不安全的,如果在开发过程中请求失败,控制台显示http不安全要用https之类的信息的话,那就是由于这个原因了.但是由于并非所有开发者都会去申请HTTPS证书来支持HTTPS访问,所以还是可以进行设置来正常访问HTTP的,方法如下: 1.在Xcode工程中找到Info.plist文件,做iOS开发的应该都了解这是一个做一些应用配置的文件: 2.在Info.plist文件中添加Dictionary类型的N

  • mysql允许外网访问以及修改mysql账号密码实操方法

    mysql的root账户,我在连接时通常用的是localhost或127.0.0.1,公司的测试服务器上的mysql也是localhost所以我想访问无法访问,测试暂停. 解决方法如下: 1,修改表,登录mysql数据库,切换到mysql数据库,使用sql语句查看"select host,user from user ;" mysql -u root -pvmwaremysql>use mysql; mysql>update user set host = '%' wher

  • iOS通过shell脚本批量修改属性

    背景 公司需要做一系列的壳版本,壳版本如果内容雷同提交到App Store会有被拒绝的风险,除了我在上一篇文章中说道的在壳版本中注入混淆的代码,防止被苹果检测到内容太过雷同而导致审核被拒绝.还有另一种可行的方法是批量修改源文件中的类名.属性.方法名称等会在二进制文件中留下符号标记的信息,绕过苹果的机器审核. 这篇文章介绍的是如何使用脚本批量修改属性名称,后续还有系列的包括使用脚本批量修改类名称.方法名称等信息的文章. 结果 下面是执行脚本替换了属性的结果图,脚本把所有需要替换的属性添加了abc后

随机推荐