iOS-通訊錄,ios通訊錄開發
1.概述:
* 對於每一個行動裝置而言,都有一個內建的資料庫-----通訊錄。
* 在IOS上,通訊錄放在SQLite3資料庫中。
* 由於不同應用之間不能直接存取,我們想要實現對資料庫的訪問,必須使用蘋果開放的API.
* 蘋果公司對資料訪問開放的API是AddressBook(低級API)和AddressBookUI(進階API).
* 為了安全考慮,訪問通訊錄需要經過使用者授權,僅需一次授權即可。
2.AddressBook 和 AddressBookUI的區別:
* AddressBook屬於低級API,可以擷取通訊錄中的資料,但是需要自構UI介面
* AddressBookUI屬於進階API,為我們提供了UI介面,使用起來比較方便。
3.AddressBook詳述
* 在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;}
4.ABAddressBookUI簡述
* 使用這個類我們可以直接調出通訊錄的介面,代碼如下:
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.上面的介紹,只是通訊錄的基本使用,當然通訊錄的方法不止這些,例如可以修改,添加,刪除連絡人的資訊,在此主要介紹了如何擷取通訊錄的資訊。