iOS通讯录开发

苹果允许访问用户的通讯录,提供的api分为两种,区别在于有没有UI界面,工作中一般都会选用有UI界面,从iOS6开始,无UI界面的通讯录信息需要获取到用户的授权才能访问通讯录,所以在使用之前是需要检测用户的授权状态

有UI界面 (无需授权)

iOS通讯录开发_第1张图片
Paste_Image.png

iOS 9 之前

点击屏幕开始选择

- (void)touchesBegan:(NSSet *)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 *)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(@"点击了取消");

}
iOS通讯录开发_第2张图片
系统提供的通讯录UI界面.png

你可能感兴趣的:(iOS通讯录开发)