美文网首页
iOS 访问通讯录

iOS 访问通讯录

作者: Brice_Zhao | 来源:发表于2016-10-26 12:02 被阅读125次

iOS 9 之后,苹果增加新特性的库 - ContactsUI.framework 和 Contacts.framework两个库
但是很多老项目仍然使用的是AddressBook.framework 库,下面先简要介绍老版本的访问通讯录的方式

导入 AddressBook.framework 库
#import <AddressBook/AddressBook.h>
  
- (void)viewDidLoad {
    [super viewDidLoad];

// 1. 创建通讯录存储对象
    ABAddressBookRef addressBook = ABAddressBookCreate();

// 2. 授权  
/*
        kABAuthorizationStatusNotDetermined = 0,   // 未知
        kABAuthorizationStatusRestricted,          // 限制
        kABAuthorizationStatusDenied,              // 拒绝
        kABAuthorizationStatusAuthorized           // 允许
*/
    if(ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusAuthorized)  {
        // 3. 开始获取数据

        // 3.1 获取所有联系人
        CFArrayRef contacts = ABAddressBookCopyArrayOfAllPeople(addressBook);
        
        CFIndex count = CFArrayGetCount(contacts);

        for (int i = 0; i < count; i ++) {
            //ABRecord : 信息(获取联系人信息)
            ABRecordRef record = CFArrayGetValueAtIndex(contacts, i);
            CFStringRef cfFirstName = ABRecordCopyValue(record,kABPersonFirstNameProperty);
            CFStringRef cfLastName = ABRecordCopyValue(record,kABPersonLastNameProperty);
            
            NSString *firstName = CFBridgingRelease(cfFirstName);
            NSString *lastName = CFBridgingRelease(cfLastName);
            
            NSLog(@"%@,%@",firstName,lastName);
            
        }
        
        CFRelease(contacts);
        CFRelease(addressBook);
        
    } else {
        ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) {
            if(error == nil) {
                NSLog(@"授权成功");
            }
            
            CFRelease(addressBook);
        });
    }
}

相关文章:https://wilddylan.github.io/2016/08/22/AddressBook-framework/

然后我们介绍一下iOS9 新特性的库

#import <ContactsUI/ContactsUI.h>
//1. 先遵循协议
@interface ViewController () <CNContactPickerDelegate>

@end

@implementation ViewController

//在点击屏幕的时候创建一个联系人选择控制器
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    // 1. 创建联系人选择控制器
    CNContactPickerViewController *contact = [[CNContactPickerViewController alloc]init];
    
    // 2. 设置代理
    contact.delegate = self;
    
    // 3. modal展示联系人页面
    [self presentViewController: contact animated:YES completion:nil];
}

#pragma mark - CNContactPickerDelegate -

1. 选择单个联系人完成后调用(单选    ⚠️:当方法- contactPicker: didSelectContacts:被实现时,此方法被屏蔽掉)
- (void)contactPicker:(CNContactPickerViewController *)picker didSelectContact:(CNContact *)contact;


2. 选择多个联系人完成后调用(多选   ⚠️:实现此方法,上面方法将被屏蔽)
- (void)contactPicker:(CNContactPickerViewController *)picker didSelectContacts:(NSArray<CNContact*> *)contacts;


3. 当点击单个联系人进入联系人属性页面,点击某属性后调用(⚠️:如果didSelectContact 和 didSelectContactProperties 这2个代理方法没有被实现才会被调用)
- (void)contactPicker:(CNContactPickerViewController *)picker didSelectContactProperty:(CNContactProperty *)contactProperty;


4. 当选择多个联系人的属性被调用
- (void)contactPicker:(CNContactPickerViewController *)picker didSelectContactProperties:(NSArray<CNContactProperty*> *)contactProperties;
单独实现didSelectContact方法, 点击页面中联系人时调用该代理方法.png 单独实现didSelectContactProperty方法, 点击联系人属性时调用该代理方法.png

相关文章

  • 重点 (二十九) : 通讯录

    如何访问用户的通讯录 在iOS中,有2个框架可以访问用户的通讯录 AddressBookUI.framework ...

  • AddressBookFramework & Conta

    iOS之前是使用 AddressBookFramework 访问通讯录,但从 iOS 9.0 开始被 Contac...

  • iOS学习笔记29-系统服务(二)通讯录

    一、通讯录 iOS中的通讯录是存储在数据库中的,由于iOS的权限设计,开发人员是不允许直接访问通讯录数据库的,实现...

  • ios 访问通讯录

    - (void)requestAuthorizationForAddressBook { // 判断当前的...

  • iOS 访问通讯录

    iOS 9 之后,苹果增加新特性的库 - ContactsUI.framework 和 Contacts.fram...

  • iOS13&Xcode11适配问题

    1.通讯录权限问题iOS 13中将禁止应用开发者访问用户通讯录备注信息,需将keys中的CNContactNote...

  • 调用系统通讯录

    #import "ViewController.h" //iOS6开始, 要访问通讯录, 必须先授权. 不授权上架...

  • 获取系统通讯录

    支持本文作者Mr_洛先森,请阅读原文获取通讯录样式: 在ios中,有两个框架可以访问用户的通讯录 AddressB...

  • iOS 通讯录的访问

    导入框架Contacts 权限判断 添加 修改 删除

  • iOS10 权限崩溃问题

    iOS10上,若你的项目访问了隐私数据,比如:相机,相册,通讯录等,app会直接Crash了,这是因为iOS10对...

网友评论

      本文标题:iOS 访问通讯录

      本文链接:https://www.haomeiwen.com/subject/edmduttx.html