* 對于每一個移動設備而言,都有一個內置的數據庫-----通訊錄。
* 在IOS上,通訊錄放在SQLite3數據庫中。
* 由于不同應用之間不能直接訪問,我們想要實現對數據庫的訪問,必須使用蘋果開放的API.
* 蘋果公司對數據訪問開放的API是AddressBook(低級API)和AddressBookUI(高級API).
* 為了安全考慮,訪問通訊錄需要經過用戶授權,僅需一次授權即可。
* AddressBook屬于低級API,可以獲取通訊錄中的數據,但是需要自構UI界面
* AddressBookUI屬于高級API,為我們提供了UI界面,使用起來比較方便。
* 在AddressBook中,比較常用的類是ABAddressBook, ABPerson, ABGroup, ABRecord
* ABAddressBook :封裝了通訊錄的接口。(對應ABAddressBookRef)
* ABPerson :封裝通信錄個人的信息數據。(對應ABPersonRef)
* ABGroup :封裝了通訊錄組信息數據。(對應ABGrouPRef)
* ABRecord :封裝了數據庫的一條記錄。(對應ABRecordRef)
想要獲取通信錄的信息,第一步是要導入AddressBook的框架,并在頭文件中寫入頭文件<AddressBook/AddressBook.h>
用戶想要訪問通訊錄,第一步要創建通訊錄對象,用于用戶請求訪問通訊錄,代碼如下:
1 ABAddressBookRef addressbook = ABAddressBookCreateWithOptions(NULL, NULL);* 如果是第一次訪問通信錄,需要獲取用戶的授權,不是第一次,直接訪問。系統給我們提供的函數是:
* ABAddressBookRequestaccessWithCompletion(<#ABAddressBookRef addressBook#>, <#^(bool granted, CFErrorRef error)completion#>)
* 如果第一次訪問,點擊允許訪問,granted的值為一。
* 只要granted的值為真的情況下,才允許訪問通訊錄。
* 獲取通訊錄的所有記錄的代碼如下:
1 NSArray *array = (NSArray *)ABAddressBookCopyArrayOfAllPeople(addressbook);* 接下來我們要獲取通訊錄的聯系人的姓名:代碼如下:
1 ABRecordRef record = array[i];2 NSString *name = (NSString *)ABRecordCopyCompositeName(record);
* 獲取聯系人的手機號的時候,是屬于一個多值屬性,跟后去聯系人姓名的時候有點不同,聯系人姓名屬于單值屬性,代碼如下:
1 ABMultiValueRef ref = ABRecordCopyValue(record, kABPersonPhoneProperty);2 NSString *phone = ABMultiValueCopyValueAtIndex(ref, 0);
* 整體代碼為:(第二個函數的功能是去掉電話號碼中的特殊字符,因為我們獲取到得號碼是蘋果給我們分隔好的)
-(void)getAddressbookContent{ ABAddressBookRef addressbook = ABAddressBookCreateWithOptions(NULL, NULL); ABAddressBookRequestAccessWithCompletion(addressbook, ^(bool granted, CFErrorRef error) { if (granted == YES) { NSArray *array = (NSArray *)ABAddressBookCopyArrayOfAllPeople(addressbook); for (int i = 0; i < array.count; i ++) { ABRecordRef record = array[i]; NSString *name = (NSString *)ABRecordCopyCompositeName(record); ABMultiValueRef ref = ABRecordCopyValue(record, kABPersonPhoneProperty); NSString *phone = ABMultiValueCopyValueAtIndex(ref, 0); NSString *phone1 = phone; phone1 = [self deleteSpecialString:phone1]; contact *c = [[contact alloc]initWithName:name withPhone:phone1]; [_arrayContact addObject:c]; [c release]; CFRelease(name); CFRelease(phone); CFRelease(ref); } } });}-(NSString *)deleteSpecialString:(NSString *)string{ string = [string stringByReplacingOccurrencesOfString:@"(" withString:@""]; string = [string stringByReplacingOccurrencesOfString:@")" withString:@""]; string = [string stringByReplacingOccurrencesOfString:@"-" withString:@""]; string = [string stringByReplacingOccurrencesOfString:@" " withString:@""]; return string;}* 使用這個類我們可以直接調出通訊錄的界面,代碼如下:
ABPeoplePickerNavigationController *picker = [[ABPeoplePickerNavigationController alloc] init];[self presentViewController:picker animated:YES completion:nil];
效果圖如下:
這個類有幾個比較常用的代理方法,分別是:
點擊取消按鈕,相應該方法
- (void)peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)peoplePicker
點擊聯系人信息,是否跳轉到詳情界面
- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person
在聯系人詳情界面中點擊了其它信息,是否跳轉到其它界面(例如,點擊時間,可以打開日歷)
- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier
5.上面的介紹,只是通訊錄的基本使用,當然通訊錄的方法不止這些,例如可以修改,添加,刪除聯系人的信息,在此主要介紹了如何獲取通訊錄的信息。
新聞熱點
疑難解答