最近有一个小项目是和通讯录开发相关的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];
这里批量添加我用的是异步线程去执行多个请求。