iOS开发-通讯录&RHAddressBook通讯录框架介绍

    xiaoxiao2021-03-25  145

    首先很久没有更博客,先跟同学们说声抱歉!那么今天我们的主题是讲如何访问系统通讯录以及第三方的一个通讯录框架的介绍,那么废话不多说,直接上代码!

     

    iOS,2个框架可以访问用户的通讯录

     AddressBookUI.framework

     提供了联系人列表界面、联系人详情界面、添加联系人界面等

     一般用于选择联系人

     

     AddressBook.framework

     纯C语言的API,仅仅获得联系人数据

     没有提供UI界面展示、需要自己搭建联系人展示界面

     里面的数据类型大部分基于Core Foundation框架、使用起来极其蛋疼

     

     从iOS6开始、需要得到用户的授权才能访问通讯录、因此在使用之前、查看用户是否已经授权(AddressBook.framework)

     从iOS8默认就有联系人 直接读取

     

     

    //

    //  ZZViewController.h

    //  01-私人通讯录(一)

    //

    //  Created by 周昭 on 2017/3/8.

    //  Copyright © 2017年 YYSP. All rights reserved.

    //

     

    #import <UIKit/UIKit.h>

     

    @interface ZZViewController : UIViewController

     

    @end

     

    //

    //  ZZViewController.m

    //  01-私人通讯录(一)

    //

    //  Created by 周昭 on 2017/3/8.

    //  Copyright © 2017年 YYSP. All rights reserved.

    //

     

    #import "ZZViewController.h"

    #import <AddressBookUI/AddressBookUI.h>

     

    @interface ZZViewController ()<ABPeoplePickerNavigationControllerDelegate>

     

    @end

     

    @implementation ZZViewController

     

    /*

     // 第三方框架 RHAddressBook(通讯录的第三方框架) 更加面向对象

     // include/ recursive 递归查找

     

     */

    - (void)viewDidLoad {

        [super viewDidLoad];

        // 1.授权

    //    [self getStatus];

    }

     

    - (void)getStatus

    {

    #warning - 这个不应该在某个控制器的时候获取授权应该在应用打开的时候就获取写在AppDelegate中

        

    /*

     ABAddressBookGetAuthorizationStatus() 授权状态

    {

        kABAuthorizationStatusNotDetermined = 0, // 未决定

        kABAuthorizationStatusRestricted, // 特殊原因不能访问用户的通讯录

        kABAuthorizationStatusDenied, // 拒绝访问

        kABAuthorizationStatusAuthorized // 已经授权

    }

    */

        // 1.0 获取用户的授权状态

        ABAuthorizationStatus status = ABAddressBookGetAuthorizationStatus();

        

        // 2.0 如果授权是未决定的,则请求授权

        //    if (status == kABAuthorizationStatusNotDetermined) {

        //        // 2.1 获取通讯录对象

        //        ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, NULL);

        //

        //        // 2.2 请求授权

        //        ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) {

        //            if (granted) {

        //                NSLog(@"用户授权成功");

        //            } else {

        //                NSLog(@"用户授权失败");

        //            }

        //        });

        //    }

        

        // 上面的代码转换成一句话如果授权不成功直接返回

        if (status != kABAuthorizationStatusNotDetermined) return;

        //

        // 授权成功继续

    }

     

    /**

     *  点击界面跳转带UI的通讯录界面

     */

    - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event

    {

        ABPeoplePickerNavigationController *ppnc = [[ABPeoplePickerNavigationController alloc] init];

        

        ppnc.peoplePickerDelegate = self;

        

        [self presentViewController:ppnc animated:YES completion:nil];

    }

     

    #pragma mark - ABPeoplePickerNavigationControllerDelegate代理方法

    /**

     *  选中某一个联系人的时候会调用该方法

     *  @param person       选中的联系人

     */

    - (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker didSelectPerson:(ABRecordRef)person

    {

    #pragma mark - 验证来了这个方法没有

        NSLog(@"%s", __func__);

        

    #warning - 这里极度需要同学们注意

    /*

     1. CoreFoundation --> Foundation 桥接(以及内存泄口一定要注意)

     2. Product --> Profile --> instrument --> leeks 检测内存泄漏

     */

        

        // 1.获取联系人姓名

        CFStringRef firstName = ABRecordCopyValue(person, kABPersonFirstNameProperty);

        CFStringRef lastName = ABRecordCopyValue(person, kABPersonLastNameProperty);

        

        /*

         __bridge NSString * : 将对象所有权给Foundation框架一份,但是本身没有释放

         __bridge_transfer NSString * : 将对象所有权交给Foundation框架,并且自身释放掉对象

         CFBridgingRelease 一种写法一种方式

         copy\creat 的都需要释放

         方法过期他会实现2个方法 走俩个方法

         */

        NSString *first = (__bridge_transfer NSString *)(firstName);

        NSString *last = (__bridge NSString *)(lastName);

        

        NSLog(@"%@---%@",first, last);

        CFRelease(lastName);

        

        // 2.获取联系人电话

        ABMultiValueRef phones = ABRecordCopyValue(person, kABPersonPhoneProperty);

        CFIndex phoneCount = ABMultiValueGetCount(phones);

        

        for (CFIndex i = 0; i < phoneCount; i++) {

            NSString *phoneLabel = CFBridgingRelease(ABMultiValueCopyLabelAtIndex(phones, i));

            NSString *phoneValue = CFBridgingRelease(ABMultiValueCopyValueAtIndex(phones, i));

            NSLog(@"%@ -- %@", phoneLabel, phoneValue);

        }

        

        // 3.释放对象

        CFRelease(phones);

    }

     

    #warning - 如果想实现了上面的方法那么下面的方法就不会走这一点要注意(同学们自己实践)

    /**

     *  选中某一个联系人的某一个属性的时候会调用该方法

     *  @param person       选中的联系人

     *  @param property     选中的属性

     *  @param identifier   属性对应的标识

     */

    - (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker didSelectPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier

    {

        NSLog(@"%s",__func__);

    }

     

    /*

    #pragma mark - iOS7的方法那么注意适配的问题

    - (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person

    {

        return NO;

    }

     

    - (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier

    {

        return NO;

    }

     

    #warning - iOS7要实现点击取消这个方法否则会崩掉

    - (void)peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)peoplePicker

    {

        [peoplePicker dismissViewControllerAnimated:YES completion:nil];

    }

    */

     

     

    @end

     

     

     

     

     

    转载请注明原文地址: https://ju.6miu.com/read-4790.html

    最新回复(0)