iOS 9.0以后 通讯录详解

 

一、通讯录框架

1、ContactsUI.framework 框架。

      拥有 AddressBookUI.framework 框架的所有功能,使用起来更加的面向对象。(iOS 9 之前的使用的)

2、Contacts.framework 框架。

     拥有 AddressBook.framework 框架的所有功能,不再是 C 语言的 API,使用起来非常简单。((iOS 9 之前的使用的))

二、CNContactUI

一、CNContactPickerViewController

1、展示通讯录界面

CNContactPickerViewController * pickerVC = [[CNContactPickerViewController alloc]init];
pickerVC.delegate = self; //<CNContactPickerDelegate>
[self presentViewController:pickerVC animated:YES completion:nil];

2、代理方法 iOS9 之后系统支持单选和多选两种情况:

// 取消代理方法
- (void)contactPickerDidCancel:(CNContactPickerViewController *)picker;
// 单选代理方法
- (void)contactPicker:(CNContactPickerViewController *)picker didSelectContact:(CNContact *)contact;
- (void)contactPicker:(CNContactPickerViewController *)picker didSelectContactProperty:(CNContactProperty *)contactProperty;
// 多选代理方法
- (void)contactPicker:(CNContactPickerViewController *)picker didSelectContacts:(NSArray<CNContact*> *)contacts;
- (void)contactPicker:(CNContactPickerViewController *)picker didSelectContactProperties:(NSArray<CNContactProperty*> *)contactProperties;

以上4个代理方法只需要实现其中的一个就可以分为单选分为单选(一次只能选中一个联系人),多选(同时选中多个联系人)2中情况,如果2种状态同时实现,则多选的优先级比较高,即首先调用多选联系人界面

单选:

如果单选状态下的2个方法同时实现,即实现则第一个方法会优先调用(即第二个方法不会被调用)
1、只实现第一个方法,点击某一个联系人,则直接会dismiss掉联系人界面
2、只实现第二个方法,点击某一个联系人会直接进入到联系人详情界面,并且受displayedPropertyKeys属性约束

 - (void)contactPicker:(CNContactPickerViewController *)picker didSelectContact:(CNContact *)contact;
 - (void)contactPicker:(CNContactPickerViewController *)picker didSelectContactProperty:(CNContactProperty *)contactProperty;

多选:

如果多选状态下的2个方法同时实现,即实现则第一个方法会优先调用(即第二个方法不会被调用
1、只实现第一个方法,在点击Done按钮的时候则直接会dismiss掉联系人界面
2、只实现第二个方法,在点击Done按钮的时候则直接会dismiss掉联系人界面

- (void)contactPicker:(CNContactPickerViewController *)picker didSelectContacts:(NSArray<CNContact*> *)contacts;
    - (void)contactPicker:(CNContactPickerViewController *)picker didSelectContactProperties:(NSArray<CNContactProperty*> *)contactProperties;

带附属属性展示界面
CNContactPickerViewController控制器有几个属性值,分别是(1)displayedPropertyKeys,(2)predicateForEnablingContact,(3)predicateForSelectionOfContact,(4)predicateForSelectionOfProperty 

// 1.创建通讯录界面(自带系统UI界面)
    CNContactPickerViewController *picketVC = [[CNContactPickerViewController alloc] init]; // 真机或者模拟器的系统版本必须是9.0以上

    // 2.遵守代理 CNContactPickerDelegate
    picketVC.delegate = self;

    // (1)picketVC.displayedPropertyKeys属性 进入联系人详情界面时需要展示的信息(必须在展示界面之前设置), displayedPropertyKeys不设置的话,会展示所有信息,如果设置的话,则只会根据数组中的信息进行展示,但是这个属性只适用于单选的状态,多选状态下不起作用。

//    picketVC.displayedPropertyKeys = @[CNContactGivenNameKey,CNContactPhoneNumbersKey,CNContactEmailAddressesKey];

    // (2)picketVC.predicateForSelectionOfContact属性 用于控制联系人选中后的操作

//    picketVC.predicateForSelectionOfContact = [NSPredicate predicateWithFormat:@"emailAddresses.@count == 1"];

    // (3)picketVC.predicateForSelectionOfContact属性 用于控制联系人属性选中后的操作

//    picketVC.predicateForSelectionOfProperty = [NSPredicate predicateWithFormat:@"(key == 'emailAddresses') AND (value LIKE '*@mac.com')"]; // 也可以是@qq.com

    // (4)picketVC.predicateForEnablingContact属性 用于控制联系人是否可以选择,如果不设置,默认所有的联系人都是可以交互的(可选中),如果设置了并且命中,则联系人不可交互,不命中的话,可以交互。此属性在多选和单选情况下都起作用
//    picketVC.predicateForEnablingContact = [NSPredicate predicateWithFormat:@"emailAddresses.@count > 0"];

    // 3.展现通讯录界面
    [self presentViewController:picketVC animated:YES completion:nil];

三、CNContact

1、查看授权状态

 CNAuthorizationStatus  status = [CNContactStore authorizationStatusForEntityType:CNEntityTypeContacts];

授权状态:

 CNAuthorizationStatusNotDetermined 用户还没有决定是否授权你的程序

CNAuthorizationStatusRestricted iOS 设备上一些许可配置阻止程序与通讯录数据库进行交互

CNAuthorizationStatusDenied 用户明确的拒绝了你的程序对通讯录的访问

用户已经授权给你的程序对通讯录进行访问  CNAuthorizationStatusAuthorized

2、创建通讯录对象

CNContactStore * store = [[CNContactStore alloc]init];

3、申请权限

CNContactStore * store = [[CNContactStore alloc]init];
[store requestAccessForEntityType:CNEntityTypeContacts completionHandler:^(BOOL granted, NSError * _Nullable error) {
    if (granted) {
        NSLog(@"授权成功");
    }else{
        NSLog(@"授权失败:%@",error);
    }
}];

4、设置访问属性Key ,每个Key对应一个属性,iOS 9 新增,如果没有设置,访问该属性就会崩溃。

// 姓名前缀
CNContactNamePrefixKey     
// 名                 
CNContactGivenNameKey                       
// 中间名
CNContactMiddleNameKey  
// 姓                   
CNContactFamilyNameKey            
// 婚前姓         
CNContactPreviousFamilyNameKey
// 姓名后缀
CNContactNameSuffixKey   
// 昵称                   
CNContactNicknameKey                        
// 公司
CNContactOrganizationNameKey                
// 部门
CNContactDepartmentNameKey                  
// 职位
CNContactJobTitleKey                        
// 名字拼音或音标
CNContactPhoneticGivenNameKey
// 中间名拼音或音标              
CNContactPhoneticMiddleNameKey
// 姓拼音或音标
CNContactPhoneticFamilyNameKey  
// 公司拼音或音标            
CNContactPhoneticOrganizationNameKey      
// 生日  
CNContactBirthdayKey   
// 农历                    
CNContactNonGregorianBirthdayKey    
// 备注        
CNContactNoteKey                            
// 图片
CNContactImageDataKey                       
// 缩略图
CNContactThumbnailImageDataKey              
// 图片是否允许访问
CNContactImageDataAvailableKey              
// 类型
CNContactTypeKey                            
// 号码
CNContactPhoneNumbersKey                    
// 电子邮件
CNContactEmailAddressesKey                  
// 地址
CNContactPostalAddressesKey                 
// 日期
CNContactDatesKey   
// URL                        
CNContactUrlAddressesKey                    
// 关联人
CNContactRelationsKey                       
// 社交
CNContactSocialProfilesKey                  
// 即时通讯
CNContactInstantMessageAddressesKey    

5、获取所有的联系人

 NSArray * keys = @[CNContactFamilyNameKey,CNContactGivenNameKey,CNContactPhoneNumbersKey];
    CNContactFetchRequest * request = [[CNContactFetchRequest alloc]initWithKeysToFetch:keys];
    
    CNContactStore * store = [[CNContactStore alloc]init];
    
    NSError * error = nil;
    [store enumerateContactsWithFetchRequest:request error:&error usingBlock:^(CNContact * _Nonnull contact, BOOL * _Nonnull stop) {
        //获取 姓名
        NSString * firstName = contact.familyName;
        NSString * lastName = contact.givenName;
        NSLog(@"firstName=%@ lastName=%@",firstName,lastName);
        
        for (CNLabeledValue *labeledValue in contact.phoneNumbers) {
            CNPhoneNumber * phoneValue = labeledValue.value;
            NSString * phoneNumber = phoneValue.stringValue;
            NSString * label = [CNLabeledValue localizedStringForLabel:labeledValue.label];
            NSLog(@"label= %@ phoneNumber=%@",label,phoneNumber);
        }
    
    }];

6、添加联系人

    //创建联系人
    CNMutableContact * contact = [self initializeContact];
    
    //创建请求
    CNSaveRequest * saveRequest = [[CNSaveRequest alloc]init];
    [saveRequest addContact:contact toContainerWithIdentifier:nil];
    
    //写入联系人
    CNContactStore * store = [[CNContactStore alloc]init];
    [store executeSaveRequest:saveRequest error:nil];

创建联系人 

- (CNMutableContact *)initializeContact{
    // 创建联系人对象
    CNMutableContact *contact = [[CNMutableContact alloc] init];
    // 设置联系人的头像
    contact.imageData = UIImagePNGRepresentation([UIImage imageNamed:@"animal"]);
    // 设置联系人姓名
    contact.givenName = @"雨路";
    // 设置姓氏
    contact.familyName = @"甘";
    // 设置联系人邮箱
    CNLabeledValue *homeEmail = [CNLabeledValue labeledValueWithLabel:CNLabelHome value:@"12345qq.com"];
    CNLabeledValue *workEmail = [CNLabeledValue labeledValueWithLabel:CNLabelWork value:@"32467@sina.cn"];
    CNLabeledValue *otherEmail = [CNLabeledValue labeledValueWithLabel:CNLabelOther value:@"lanaj.com"];
    contact.emailAddresses = @[homeEmail,workEmail,otherEmail];
    // 设置机构名
    contact.organizationName = @"互联网";
    // 设置部门
    contact.departmentName = @"物流";
    // 设置工作的名称
    contact.jobTitle = @"ios";
    // 设置社会的简述
    CNSocialProfile *profile = [[CNSocialProfile alloc] initWithUrlString:@"12306.cn" username:@"lily" userIdentifier:nil service:@"IT行业"];
    CNLabeledValue *socialProfile = [CNLabeledValue labeledValueWithLabel:CNSocialProfileServiceGameCenter value:profile];
    contact.socialProfiles = @[socialProfile];
    // 设置电话号码
    CNPhoneNumber *mobileNumber = [[CNPhoneNumber alloc] initWithStringValue:@"15201596724"];
    CNLabeledValue *mobilePhone = [[CNLabeledValue alloc] initWithLabel:CNLabelPhoneNumberMobile value:mobileNumber];
    contact.phoneNumbers = @[mobilePhone];
    // 设置与联系人的关系
    CNContactRelation *friend = [[CNContactRelation alloc] initWithName:@"好朋友"];
    CNLabeledValue *relation = [CNLabeledValue labeledValueWithLabel:CNLabelContactRelationFriend value:friend];
    contact.contactRelations = @[relation];
    // 设置生日
    NSDateComponents *birthday = [[NSDateComponents alloc] init];
    birthday.day = 6;
    birthday.month = 5;
    birthday.year = 2000;
    contact.birthday = birthday;
    
    return contact;
}

7、删除联系人

    CNMutableContact * contact = [self initializeContact];
    CNSaveRequest *  request = [[CNSaveRequest alloc]init];
    [request deleteContact:contact];
    
    CNContactStore * store = [[CNContactStore alloc]init];
    [store executeSaveRequest:request error:nil];

8、更新联系人

    CNMutableContact * contact = [self initializeContact];
    CNSaveRequest *  request = [[CNSaveRequest alloc]init];
    [request updateContact:contact];
    
    CNContactStore * store = [[CNContactStore alloc]init];
    [store executeSaveRequest:request error:nil];
}

9、查找联系人

-(NSArray *)queryContactWithName:(NSString*)name{
    CNContactStore * store = [[CNContactStore alloc]init];
    //根据名称去查询,可以设置其它条件
    NSPredicate * predicate = [CNContact predicateForContactsMatchingName:name];
    return  [store unifiedContactsMatchingPredicate:predicate keysToFetch:@[CNContactGivenNameKey] error:nil];
}

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值