Contacts 通訊錄
1、訪問通訊錄
設定系統訪問通訊錄許可權
1.1 iOS 9.0 及 iOS 9.0 之後獲取通訊錄的方法
iOS 9.0 及 iOS 9.0 之後獲取通訊錄的方法
// 包含標頭檔案 #import <Contacts/Contacts.h> #import <ContactsUI/ContactsUI.h> // 獲取通訊錄資訊,自定義方法 - (void)fetchAddressBookOnIOS9AndLater { // 建立 CNContactStore 物件 CNContactStore *contactStore = [[CNContactStore alloc] init]; // 首次訪問需使用者授權 if ([CNContactStore authorizationStatusForEntityType:CNEntityTypeContacts] == CNAuthorizationStatusNotDetermined) { // 首次訪問通訊錄 [contactStore requestAccessForEntityType:CNEntityTypeContacts completionHandler:^(BOOL granted, NSError * _Nullable error) { if (!error){ if (granted) { // 允許 NSLog(@"已授權訪問通訊錄"); NSArray *contacts = [self fetchContactWithContactStore:contactStore]; // 訪問通訊錄 dispatch_async(dispatch_get_main_queue(), ^{ // 主執行緒 更新 UI NSLog(@"contacts:%@", contacts); }); } else { // 拒絕 NSLog(@"拒絕訪問通訊錄"); } } else { NSLog(@"發生錯誤!"); } }]; } else { // 非首次訪問通訊錄 NSArray *contacts = [self fetchContactWithContactStore:contactStore]; // 訪問通訊錄 dispatch_async(dispatch_get_main_queue(), ^{ // 主執行緒 更新 UI NSLog(@"contacts:%@", contacts); }); } } // 訪問通訊錄,自定義方法 - (NSMutableArray *)fetchContactWithContactStore:(CNContactStore *)contactStore { // 判斷訪問許可權 if ([CNContactStore authorizationStatusForEntityType:CNEntityTypeContacts] == CNAuthorizationStatusAuthorized) { // 有許可權訪問 NSError *error = nil; // 建立陣列,必須遵守 CNKeyDescriptor 協議,放入相應的字串常量來獲取對應的聯絡人資訊 NSArray <id<CNKeyDescriptor>> *keysToFetch = @[CNContactFamilyNameKey, CNContactGivenNameKey, CNContactPhoneNumbersKey]; // 獲取通訊錄陣列 NSArray<CNContact*> *arr = [contactStore unifiedContactsMatchingPredicate:nil keysToFetch:keysToFetch error:&error]; if (!error) { NSMutableArray *contacts = [NSMutableArray array]; for (int i = 0; i < arr.count; i++) { CNContact *contact = arr[i]; NSString *givenName = contact.givenName; NSString *familyName = contact.familyName; NSString *phoneNumber = ((CNPhoneNumber *)(contact.phoneNumbers.lastObject.value)).stringValue; [contacts addObject:@{@"name":[givenName stringByAppendingString:familyName], @"phoneNumber":phoneNumber}]; } return contacts; } else { return nil; } } else { // 無許可權訪問 NSLog(@"無許可權訪問通訊錄"); return nil; } }
效果
1.2 iOS 9.0 之前獲取通訊錄的方法
iOS 9.0 之前獲取通訊錄的方法
// 包含標頭檔案 #import <AddressBook/AddressBook.h> // 獲取通訊錄資訊,自定義方法 - (void)fetchAddressBookBeforeIOS9 { ABAddressBookRef addressBook = ABAddressBookCreate(); // 首次訪問需使用者授權 if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusNotDetermined) { // 首次訪問通訊錄 ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) { if (!error) { if (granted) { // 允許 NSLog(@"已授權訪問通訊錄"); NSArray *contacts = [self fetchContactWithAddressBook:addressBook]; dispatch_async(dispatch_get_main_queue(), ^{ // 主執行緒 更新 UI NSLog(@"contacts:%@", contacts); }); } else { // 拒絕 NSLog(@"拒絕訪問通訊錄"); } } else { NSLog(@"發生錯誤!"); } }); } else { // 非首次訪問通訊錄 NSArray *contacts = [self fetchContactWithAddressBook:addressBook]; dispatch_async(dispatch_get_main_queue(), ^{ // 主執行緒 更新 UI NSLog(@"contacts:%@", contacts); }); } } // 訪問通訊錄,自定義方法 - (NSMutableArray *)fetchContactWithAddressBook:(ABAddressBookRef)addressBook { if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusAuthorized) { // 有許可權訪問 // 獲取聯絡人陣列 NSArray *array = (__bridge NSArray *)ABAddressBookCopyArrayOfAllPeople(addressBook); NSMutableArray *contacts = [NSMutableArray array]; for (int i = 0; i < array.count; i++) { //獲取聯絡人 ABRecordRef people = CFArrayGetValueAtIndex((__bridge ABRecordRef)array, i); // 獲取聯絡人詳細資訊,如:姓名,電話,住址等資訊 NSString *firstName = (__bridge NSString *)ABRecordCopyValue(people, kABPersonFirstNameProperty); NSString *lastName = (__bridge NSString *)ABRecordCopyValue(people, kABPersonLastNameProperty); ABMutableMultiValueRef *phoneNumRef = ABRecordCopyValue(people, kABPersonPhoneProperty); NSString *phoneNumber = ((__bridge NSArray *)ABMultiValueCopyArrayOfAllValues(phoneNumRef)).lastObject; [contacts addObject:@{@"name": [firstName stringByAppendingString:lastName], @"phoneNumber": phoneNumber}]; } return contacts; } else { // 無許可權訪問 NSLog(@"無許可權訪問通訊錄"); return nil; } }
效果
2、對通訊錄的操作
對通訊錄的操作
// 包含標頭檔案 #import <Contacts/Contacts.h> #import <ContactsUI/ContactsUI.h> // 遵守協議 <CNContactPickerDelegate> @property (nonatomic, strong) NSArray *contacts; @property (nonatomic, strong) NSArray *groups;
2.1 開啟通訊錄
開啟通訊錄
// 初始化 CNContactPickerViewController CNContactPickerViewController *contactPickerVC = [[CNContactPickerViewController alloc] init]; // 設定代理,需遵守 CNContactPickerDelegate 協議 contactPickerVC.delegate = self; // 顯示聯絡人視窗檢視 [self presentViewController:contactPickerVC animated:YES completion:nil]; // 取消,CNContactPickerDelegate 協議方法 - (void)contactPickerDidCancel:(CNContactPickerViewController *)picker { // 點選聯絡人控制器的 Cancel 按鈕執行該方法,picker 聯絡人控制器 NSLog(@"取消"); } // 選中聯絡人,CNContactPickerDelegate 協議方法 - (void)contactPicker:(CNContactPickerViewController *)picker didSelectContact:(CNContact *)contact { // 選中聯絡人時執行該方法,picker 聯絡人控制器,contact 聯絡人 NSLog(@"聯絡人的資料:%@", contact); [self dismissViewControllerAnimated:YES completion:nil]; // 顯示聯絡人詳細頁面 CNContactViewController *contactVC = [CNContactViewController viewControllerForContact:contact]; contactVC.displayedPropertyKeys = @[CNContactGivenNameKey, CNContactPhoneNumbersKey, CNContactFamilyNameKey, CNContactInstantMessageAddressesKey, CNContactEmailAddressesKey, CNContactDatesKey, CNContactUrlAddressesKey, CNContactBirthdayKey, CNContactImageDataKey]; [self presentViewController:contactVC animated:YES completion:nil]; }
2.2 聯絡人操作
1、增加聯絡人
// 增加的聯絡人資訊 CNMutableContact *contact = [self initializeContact]; // 建立請求 CNSaveRequest *saveRequest = [[CNSaveRequest alloc] init]; // 新增聯絡人 [saveRequest addContact:contact toContainerWithIdentifier:nil]; // 同步到通訊錄 CNContactStore *store = [[CNContactStore alloc] init]; [store executeSaveRequest:saveRequest error:NULL]; // 初始化聯絡人資訊 - (CNMutableContact *)initializeContact { // 建立聯絡人物件 CNMutableContact *contact = [[CNMutableContact alloc] init]; // 設定聯絡人的頭像 contact.imageData = UIImagePNGRepresentation([UIImage imageNamed:@"demo5"]); // 設定聯絡人姓名 contact.givenName = @"Qian"; // 設定姓氏 contact.familyName = @"Chia"; // 設定聯絡人郵箱 CNLabeledValue *homeEmail = [CNLabeledValue labeledValueWithLabel:CNLabelHome value:@"qianchia@icloud.com"]; CNLabeledValue *workEmail = [CNLabeledValue labeledValueWithLabel:CNLabelWork value:@"qianchia@icloud.com"]; CNLabeledValue *otherEmail = [CNLabeledValue labeledValueWithLabel:CNLabelOther value:@"qianchia@icloud.com"]; contact.emailAddresses = @[homeEmail,workEmail,otherEmail]; // 設定機構名 contact.organizationName = @"網際網路"; // 設定部門 contact.departmentName = @"Development"; // 設定工作的名稱 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:@"15188888888"]; 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; }
2、刪除聯絡人
// 要刪除的聯絡人 CNMutableContact *contact = [self.contacts[0] mutableCopy]; // 建立請求 CNSaveRequest *saveRequest = [[CNSaveRequest alloc] init]; // 刪除聯絡人 [saveRequest deleteContact:contact]; // 同步到通訊錄 CNContactStore *store = [[CNContactStore alloc] init]; [store executeSaveRequest:saveRequest error:NULL];
3、修改聯絡人
// 要修改的聯絡人資訊 CNMutableContact *contact = [self.contacts[0] mutableCopy]; contact.givenName = @"Qianqian"; // 建立請求 CNSaveRequest *saveRequest = [[CNSaveRequest alloc] init]; // 修改聯絡人 [saveRequest updateContact:contact]; // 同步到通訊錄 CNContactStore *store = [[CNContactStore alloc] init]; [store executeSaveRequest:saveRequest error:NULL];
4、查詢聯絡人
// 要查詢的聯絡人 GivenName NSString *checkName = @"Qian"; // 檢索條件 NSPredicate *predicate = [CNContact predicateForContactsMatchingName:checkName]; // 提取資料 (keysToFetch:@[CNContactGivenNameKey] 是設定提取聯絡人的哪些資料) CNContactStore *store = [[CNContactStore alloc] init]; NSArray *contactArray = [store unifiedContactsMatchingPredicate:predicate keysToFetch:@[CNContactGivenNameKey] error:NULL]; self.contacts = contactArray;
2.3 聯絡人群組操作
1、增加群組
// 要增加的群組 CNMutableGroup *group = [[CNMutableGroup alloc] init]; group.name = @"QianFriend"; // 建立請求 CNSaveRequest *saveRequest = [[CNSaveRequest alloc] init]; // 增加群組 [saveRequest addGroup:group toContainerWithIdentifier:nil]; // 同步到通訊錄 CNContactStore *store = [[CNContactStore alloc] init]; [store executeSaveRequest:saveRequest error:NULL];
2、刪除群組
// 要刪除的群組 CNMutableGroup *group = self.groups[0]; // 建立請求 CNSaveRequest *saveRequest = [[CNSaveRequest alloc] init]; // 刪除群組 [saveRequest deleteGroup:group]; // 同步到通訊錄 CNContactStore *store = [[CNContactStore alloc] init]; [store executeSaveRequest:saveRequest error:NULL];
3、修改群組
// 要修改的群組 CNMutableGroup *group = self.groups[0]; group.name = @"QianWork"; // 建立請求 CNSaveRequest *saveRequest = [[CNSaveRequest alloc] init]; // 修改群組 [saveRequest updateGroup:group]; // 同步到通訊錄 CNContactStore *store = [[CNContactStore alloc] init]; [store executeSaveRequest:saveRequest error:NULL];
4、查詢群組
CNContactStore *store = [[CNContactStore alloc] init]; // 查詢所有的 group(predicate 引數為空時會查詢所有的 group) NSArray *groupArray = [store groupsMatchingPredicate:nil error:NULL]; self.groups = groupArray;
5、向群組中新增聯絡人
// 要新增的聯絡人和群組 CNContact *contact = self.contacts[0]; CNMutableGroup *group = self.groups[0]; // 建立請求 CNSaveRequest *saveRequest = [[CNSaveRequest alloc] init]; // 向群組中新增聯絡人 [saveRequest addMember:contact toGroup:group]; // 同步到通訊錄 CNContactStore *store = [[CNContactStore alloc] init]; [store executeSaveRequest:saveRequest error:NULL];
6、從群組中刪除聯絡人
// 要刪除的聯絡人和群組 CNContact *contact = self.contacts[0]; CNMutableGroup *group = self.groups[0]; // 建立請求 CNSaveRequest *saveRequest = [[CNSaveRequest alloc] init]; // 從群組中刪除聯絡人 [saveRequest removeMember:contact fromGroup:group]; // 同步到通訊錄 CNContactStore *store = [[CNContactStore alloc] init]; [store executeSaveRequest:saveRequest error:NULL];