使用步驟
-
AddressBook.framework框架, 由于大部分都是基于CoreFoundation實現的, 因此要注意一些細節
- CoreFoundation變量基本都是: 變量名+Ref 類型的變量
- 由于ARC管理的是Foundation的OC對象, 因此CoreFoundation的對象要手動釋放內存
- 該框架如果要訪問通訊錄, 一定要向用戶請求授權
- 該框架沒有UI界面, 必須通過數據的獲取后, 手動搭建UI界面
- 對于微信那種, 檢測通訊錄中的好友, 就不需要UI界面, 直接檢測即可, 所以使用這個框架比較合適
-
大致使用步驟
-
在使用該框架之前, 一定要先向用戶發送授權申請
/* kABAuthorizationStatusNotDetermined 用戶還沒有決定, 想用戶發送申請授權的請求 kABAuthorizationStatusRestricted 由于某種原因訪問受限, 這個通常是用戶手機上的一些設定, 直接提醒用戶自行檢查即可 kABAuthorizationStatusDenied 你的App已經被用戶拒絕訪問了, 給用戶個提示, 提醒他去設置頁面解除訪問 kABAuthorizationStatusAuthorized 已經授權了, 可以訪問 */ - (void)getAuthor { // 判斷當前的授權狀態是否為"用戶未決定" if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusNotDetermined) { // 1. 創建通訊錄對象 ABAddressBookRef bookRef = ABAddressBookCreate(); // 2. 發送通訊錄授權申請 ABAddressBookRequestAccessWithCompletion(bookRef, ^(bool granted, CFErrorRef error) { // 3. 根據回調, 判斷是否授權成功 if (granted) { NSLog(@"授權成功"); } else { NSLog(@"授權失敗"); } }); } }
-
獲取通訊錄中的信息
在獲取之前, 謹慎起見應該再次判斷一下授權狀態, 提示一下用戶
獲取通訊錄中所有的信息, 返回的是一個數組, 這個數組必須用CoreFoundation框架的數組來接收:
CFArrayRef
注意1: 如果要使用CoreFoundation框架中的字符串, 應該先轉換為Foundation的字符串再去使用
注意2: 電話號碼會有很多不同的類別: 家用/手機/主要等等, 因此返回的也是數組, 所以要通過遍歷來獲取
-
注意3: 不再使用的CoreFoundation對象, 一定要手動釋放, 否則會有內存泄露
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { // 1. 判斷當前的授權狀態 if (ABAddressBookGetAuthorizationStatus() != kABAuthorizationStatusAuthorized) { NSLog(@"請先授權"); return; } // 2. 獲取通訊錄對象 ABAddressBookRef bookRef = ABAddressBookCreate(); // 3. 獲取通訊錄中所有的聯系人信息 CFArrayRef arrayRef = ABAddressBookCopyArrayOfAllPeople(bookRef); // 4. 遍歷所有的聯系人信息, 獲取其中需要的內容 CFIndex count = CFArrayGetCount(arrayRef); for (int i = 0; i < count; i++) { // 4.1 創建一個記錄對象 ABRecordRef record = CFArrayGetValueAtIndex(arrayRef, i); // 4.2 獲取姓名 NSString *firstName = (__bridge_transfer NSString *)ABRecordCopyValue(record, kABPersonFirstNameProperty); NSString *lastName = (__bridge_transfer NSString *)ABRecordCopyValue(record, kABPersonLastNameProperty); NSLog(@"%@--%@", firstName, lastName); // 4.3 獲取電話號碼 ABMultiValueRef mutiValue = ABRecordCopyValue(record, kABPersonPhoneProperty); CFIndex count = ABMultiValueGetCount(mutiValue); // 5. 遍歷電話號碼的數組 for (int i = 0; i < count; i++) { NSString *label = (__bridge_transfer NSString *)ABMultiValueCopyLabelAtIndex(mutiValue, i); NSString *phone = (__bridge_transfer NSString *)ABMultiValueCopyValueAtIndex(mutiValue, i); NSLog(@"%@--%@", label, phone); } } // 6. 釋放對象 CFRelease(bookRef); CFRelease(arrayRef); }
-