美文网首页通讯录
iOS通讯录开发

iOS通讯录开发

作者: 蚂蚁牙齿不黑 | 来源:发表于2016-04-01 16:51 被阅读761次
苹果允许访问用户的通讯录,提供的api分为两种,区别在于有没有UI界面,工作中一般都会选用有UI界面,从iOS6开始,无UI界面的通讯录信息需要获取到用户的授权才能访问通讯录,所以在使用之前是需要检测用户的授权状态

有UI界面 (无需授权)

Paste_Image.png

iOS 9 之前

点击屏幕开始选择

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    // 1.创建选择联系人的界面
    ABPeoplePickerNavigationController *ppnc = [[ABPeoplePickerNavigationController alloc] init];
    
    // 2.设置代理      
    ppnc.peoplePickerDelegate = self;
    
    // 3.弹出界面(modal)
    [self presentViewController:ppnc animated:YES completion:nil];
}

底部弹出通讯录控制器

// 何时触发:   选中某一个联系人时,会执行该方法
//  备注: 如果实现该方法,那么选中一个联系人,系统会自动退出控制器    如果不实现就会来到用户详情的控制器

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

    //   ABRecordRef : 记录,一个联系人就是一条记录

    // 1.获取该联系人的姓名
    CFStringRef firstName = ABRecordCopyValue(person, kABPersonFirstNameProperty);
    CFStringRef lastName = ABRecordCopyValue(person, kABPersonLastNameProperty);
    
    /*
     桥接方式:
     (__bridge NSString *) : 仅仅是将对象的所有权交给Foundation的引用使用
     (__bridge_transfer NSString *) : 对象所有权交给Foundation的引用,并且内存也交给它来管理
     */
    NSString *firstname = (__bridge_transfer NSString *)firstName;
    NSString *lastname = (__bridge_transfer NSString *)lastName;
    NSLog(@"firstname:%@ lastname:%@", firstname, lastname);
    
    // 2.获取该联系人的电话号码
    // 2.1.获取所有的电话
    ABMultiValueRef phones = ABRecordCopyValue(person, kABPersonPhoneProperty);
    
    // 2.2.遍历所有的电话
    CFIndex count = ABMultiValueGetCount(phones);
    for (int i = 0; i < count; i++) {
        // 2.2.1.获取电话号码
        NSString *phoneValue = (__bridge_transfer NSString *)ABMultiValueCopyValueAtIndex(phones, i);
        
        // 2.2.2.获取电话的标签
        NSString *phoneLabel = (__bridge_transfer NSString *)ABMultiValueCopyLabelAtIndex(phones, i);
        
        NSLog(@"%@ %@", phoneLabel, phoneValue);
    }
    
    // 3.释放不再使用的对象
    CFRelease(phones);
}

点击取消会触发该方法

// 点击了取消按钮会执行该方法
- (void)peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)peoplePicker
{
    NSLog(@"peoplePicker:%@",peoplePicker);
}

在用户详情控制器点击属性之会来到这里

// 如果实现了该方法,那么选中一个联系人的一个属性后,系统会自动退出控制器
- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker didSelectPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier
{
    NSLog(@"person:%@",person);
    NSLog(@"property:%zd",property);
    NSLog(@"identifier:%zd",identifier);
}

iOS9以后 也提供了两套框架 使用起来更加的面向对象

ContactsUI.framework 有UI

Contacts.framework 无UI

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    // 1.创建联系人的界面
    CNContactPickerViewController *cpvc = [[CNContactPickerViewController alloc] init];
    
    // 2.设置代理
    cpvc.delegate = self;
    
    // 3.弹出控制器
    [self presentViewController:cpvc animated:YES completion:nil];
}

#pragma mark - 实现CNContactPickerViewController的代理方法

- (void)contactPicker:(CNContactPickerViewController *)picker didSelectContact:(CNContact *)contact
{
    // 1.获取联系人的姓名
    NSString *firstname = contact.familyName;
    NSString *lastname = contact.givenName;
    NSLog(@"%@ %@", firstname, lastname);
    
    // 2.获取电话号码
    NSArray *phones = contact.phoneNumbers;
    
    // 3.遍历所有的电话号码
    for (CNLabeledValue *labeldValue in phones) {
        // 3.1.取出电话号码的标签
        NSString *phoneLabel = labeldValue.label;
        
        // 3.2.取出电话号码的值
        CNPhoneNumber *phoneNumer = labeldValue.value;
        NSString *phoneValue = phoneNumer.stringValue;
        NSLog(@"%@ %@", phoneLabel, phoneValue);
    }
}
//  取消的时候执行该方法
- (void)contactPickerDidCancel:(CNContactPickerViewController *)picker{
    NSLog(@"点击了取消");

}
系统提供的通讯录UI界面.png

相关文章

  • iOS开发系列--通讯录、蓝牙、内购、GameCenter、iC

    iOS开发系列--通讯录、蓝牙、内购、GameCenter、iCloud、Passbook系统服务开发汇总http...

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

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

  • ios9下vue使用踩坑记录

    问题描述 使用vue开发单页的通讯录选择器组件后。 在iOS 10 和 iOS 8下都正常运行。 就在iOS 9下...

  • iOS13&Xcode11适配问题

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

  • iOS通讯录开发

    场景一:直接选择一个联系人的电话号码 这里不需要先获取所有的联系人自己做联系人列表,直接使用系统自带的Addres...

  • iOS通讯录开发

    今天正好用到通讯录,总结一下使用过程.首先苹果的通讯录是保存在数据库里面的,苹果不允许开发者直接访问数据库.不过可...

  • iOS通讯录开发

    苹果允许访问用户的通讯录,提供的api分为两种,区别在于有没有UI界面,工作中一般都会选用有UI界面,从iOS6开...

  • iOS通讯录开发

    前言 记录下在应用内获取通讯录的相关知识点,涉及到通讯录权限配置,通讯录数据的获取以及数据按首字母排序。 系统通讯...

  • iOS 中简单通讯录列表的使用

    iOS 中简单通讯录列表的使用 最近开发的App有读取用户通讯录的需要,做完这块功能之后顺便整理了一下流程,如下:...

  • iOS9.0之前和之后获取通讯录的方法

    1. iOS 9.0之前获取通讯录的方法 打印结果: 2. iOS 9.0 及 iOS 9.0之后获取通讯录的方法...

网友评论

  • 我的大名叫小爱:都调到ui了,不授权就可以。
  • 郭小弟:iOS9之前的方法,支持iOS7吗?
    蚂蚁牙齿不黑:@码上有钱 可以
  • 明明明Y:iOS9 的方法 在走完selectContact的方法 之后 直接返回上一个界面了
    蚂蚁牙齿不黑:@明明明Y 实现selectContact 就不会去详情 不实现就会去到详情界面
  • 超_iOS:不需要询问用户开启权限吗
    蚂蚁牙齿不黑:@小菜超 无UI的那套api会被拒 有UI的这套api 即使是在设置里关掉授权同样也可以访问,可能是系统的bug,不过工作中还是建议先检测用户的授权状态吧,允许了再访问。
    超_iOS:@小菜超 不是不询问权限会被距吗
    蚂蚁牙齿不黑:@小菜超 无UI界面的那套api是需要获取用户授权允许后才能访问的,有UI界面就不用授权了,可以拷贝我上面的有UI的代码测试下 在通用->隐私->通讯录 关掉授权

本文标题: iOS通讯录开发

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