美文网首页通讯录
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

    相关文章

      网友评论

      • 我的大名叫小爱:都调到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