iOS通讯录相关开发

最近有一个小项目是和通讯录开发相关的App,功能非常简单,跟大家分享一下。

首先跟大家一起分享下这次开发碰到的一些坑。
1.在每个人的通讯录里,可能存在单个联系人有多个号码,或者是有很多其他App植入的一些号码没有姓、名,只有公司名(如钉钉、worktile),这里我筛选条件的具体字段是
// 获取指定的字段,并不是要获取所有字段,需要指定具体的字段

NSArray *fetchKeys = @[[CNContactFormatter descriptorForRequiredKeysForStyle:CNContactFormatterStyleFullName],
CNContactPhoneNumbersKey,CNContactThumbnailImageDataKey,CNContactOrganizationNameKey];

CNContactFetchRequest *fetchRequest = [[CNContactFetchRequest alloc] initWithKeysToFetch:fetchKeys];
CNContactStore *contactStore = [[CNContactStore alloc] init];

[contactStore enumerateContactsWithFetchRequest:fetchRequest error:nil usingBlock:^(CNContact * _Nonnull contact, BOOL * _Nonnull stop) {
    
    NSString *name = [CNContactFormatter stringFromContact:contact style:CNContactFormatterStyleFullName]; // 姓+名+公司名
    
    //do some thing,这里我做的操作是把一些我需要的字段,存入我自己的模型中
}];

如上代码可以获取到和通讯录相同数量的联系人,这里主要是获取的字段有全名(姓+名)、手机号、头像、公司名。
注:这里需要说的CNContact这个类里面有一个identifier字段,是每一个联系人的唯一标示,后面删除联系人的时候,我是用这个字段来完成删除操作的。

2.存联系人

CNMutableContact *contact = [[CNMutableContact alloc] init];

contact.givenName = @"enter contact name"; //姓

CNLabeledValue *homePhone = [CNLabeledValue labeledValueWithLabel:CNLabelPhoneNumberiPhone value:[CNPhoneNumber phoneNumberWithStringValue:@"enter contact phone"]];

contact.phoneNumbers = @[homePhone]; // 这里可以存入多个号码

CNSaveRequest *request = [[CNSaveRequest alloc] init];
[request addContact:contact toContainerWithIdentifier:nil];

        CNContactStore *store = [[CNContactStore alloc] init];
        
        [store executeSaveRequest:request error:nil];

这里批量添加我用的是异步线程去执行多个请求。

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