(轉 http://blog.csdn.net/lichengliang82421/article/details/6863705)
(個人說明:刪除和添加聯系人是本人在真機上測試過的。支持一下!!!)
(另:需要操作聯系人群組的朋友,可以參考iPhone 添加刪除聯系人組)
1.需要引入AddressBook.framework框架
2.iPhone通訊錄的增加聯系人的操作,代碼如下(放到項目中可直接運行):
// 初始化一個ABAddressBookRef對象,使用完之后需要進行釋放, // 這里使用CFRelease進行釋放 // 相當於通訊錄的一個引用 ABAddressBookRef addressBook = ABAddressBookCreate(); // 新建一個聯系人 // ABRecordRef是一個屬性的集合,相當於通訊錄中聯系人的對象 // 聯系人對象的屬性分為兩種: // 只擁有唯一值的屬性和多值的屬性。 // 唯一值的屬性包括:姓氏、名字、生日等。 // 多值的屬性包括:電話號碼、郵箱等。 ABRecordRef person = ABPersonCreate(); NSString *firstName = @"四"; NSString *lastName = @"李"; NSDate *birthday = [NSDate date]; // 電話號碼數組 NSArray *phones = [NSArray arrayWithObjects:@"123",@"456", nil]; // 電話號碼對應的名稱 NSArray *labels = [NSArray arrayWithObjects:@"iphone",@"home", nil]; // 保存到聯系人對象中,每個屬性都對應一個宏,例如:kABPersonFirstNameProperty // 設置firstName屬性 ABRecordSetValue(person, kABPersonFirstNameProperty, (CFStringRef)firstName, NULL); // 設置lastName屬性 ABRecordSetValue(person, kABPersonLastNameProperty, (CFStringRef) lastName, NULL); // 設置birthday屬性 ABRecordSetValue(person, kABPersonBirthdayProperty, (CFDateRef)birthday, NULL); // ABMultiValueRef類似是Objective-C中的NSMutableDictionary ABMultiValueRef mv = ABMultiValueCreateMutable(kABMultiStringPropertyType); // 添加電話號碼與其對應的名稱內容 for (int i = 0; i < [phones count]; i ++) { ABMultiValueIdentifier mi = ABMultiValueAddValueAndLabel(mv, (CFStringRef)[phones objectAtIndex:i], (CFStringRef)[labels objectAtIndex:i], &mi); } // 設置phone屬性 ABRecordSetValue(person, kABPersonPhoneProperty, mv, NULL); // 釋放該數組 if (mv) { CFRelease(mv); } // 將新建的聯系人添加到通訊錄中 ABAddressBookAddRecord(addressBook, person, NULL); // 保存通訊錄數據 ABAddressBookSave(addressBook, NULL); // 釋放通訊錄對象的引用 if (addressBook) { CFRelease(addressBook); }
(添加,以上只有單一屬性的添加,但是碰見如地址這樣的屬性,該怎樣添加呢,請看下面!)
ABAddressBookRef iPhoneAddressBook = ABAddressBookCreate(); ABRecordRef newPerson = ABPersonCreate(); CFErrorRef error = NULL; //address ABMutableMultiValueRef multiAddress = ABMultiValueCreateMutable(kABMultiDictionaryPropertyType); NSMutableDictionary *addressDictionary = [[NSMutableDictionary alloc] init]; //Street [addressDictionary setObject:@"750 North Orleans Street, Ste 601" forKey:(NSString *) kABPersonAddressStreetKey]; //City [addressDictionary setObject:@"Chicago" forKey:(NSString *)kABPersonAddressCityKey]; //State [addressDictionary setObject:@"IL" forKey:(NSString *)kABPersonAddressStateKey]; //Zip [addressDictionary setObject:@"60654" forKey:(NSString *)kABPersonAddressZIPKey]; //label ABMultiValueAddValueAndLabel(multiAddress, addressDictionary, kABWorkLabel, NULL); ABRecordSetValue(newPerson, kABPersonAddressProperty, multiAddress,&error); CFRelease(multiAddress);
是不是很簡單!
------------------------------------------------------------------------------------------------
3.刪除聯系人的操作,代碼如下(放到項目中可直接運行):
1 // 初始化並創建通訊錄對象,記得釋放內存 2 ABAddressBookRef addressBook = ABAddressBookCreate(); 3 // 獲取通訊錄中所有的聯系人 4 NSArray *array = (NSArray *)ABAddressBookCopyArrayOfAllPeople(addressBook); 5 // 遍歷所有的聯系人並刪除(這里只刪除姓名為張三的) 6 for (id obj in array) { 7 ABRecordRef people = (ABRecordRef)obj; 8 NSString *firstName = (NSString *)ABRecordCopyValue(people, kABPersonFirstNameProperty); 9 NSString *lastName = (NSString *)ABRecordCopyValue(people, kABPersonLastNameProperty); 10 if ([firstName isEqualToString:@"三"] && [lastName isEqualToString:@"張"]) { 11 ABAddressBookRemoveRecord(addressBook, people, NULL); 12 } 13 } 14 // 保存修改的通訊錄對象 15 ABAddressBookSave(addressBook, NULL); 16 // 釋放通訊錄對象的內存 17 if (addressBook) { 18 CFRelease(addressBook); 19 }
----------------------------------------------------------------------------------------------
4.修改聯系人的操作,代碼如下(由於項目中使用到了修改聯系人的操作,所以將方法直接復制過來了):
// 根據姓氏、名字以及手機號碼修改聯系人的昵稱和生日
1 + (void) updateAddressBookPersonWithFirstName:(NSString *)firstName 2 lastName:(NSString *)lastName 3 mobile:(NSString *)mobile 4 nickname:(NSString *)nickname 5 birthday:(NSDate *)birthday { 6 7 // 初始化並創建通訊錄對象,記得釋放內存 8 ABAddressBookRef addressBook = ABAddressBookCreate(); 9 // 獲取通訊錄中所有的聯系人 10 NSArray *array = (NSArray *)ABAddressBookCopyArrayOfAllPeople(addressBook); 11 // 遍歷所有的聯系人並修改指定的聯系人 12 for (id obj in array) { 13 ABRecordRef people = (ABRecordRef)obj; 14 NSString *fn = (NSString *)ABRecordCopyValue(people, kABPersonFirstNameProperty); 15 NSString *ln = (NSString *)ABRecordCopyValue(people, kABPersonLastNameProperty); 16 ABMultiValueRef mv = ABRecordCopyValue(people, kABPersonPhoneProperty); 17 NSArray *phones = (NSArray *)ABMultiValueCopyArrayOfAllValues(mv); 18 // firstName同時為空或者firstName相等 19 BOOL ff = ([fn length] == 0 && [firstName length] == 0) || ([fn isEqualToString:firstName]); 20 // lastName同時為空或者lastName相等 21 BOOL lf = ([ln length] == 0 && [lastName length] == 0) || ([ln isEqualToString:lastName]); 22 // 由於獲得到的電話號碼不符合標准,所以要先將其格式化再比較是否存在 23 BOOL is = NO; 24 for (NSString *p in phones) { 25 // 紅色代碼處,我添加了一個類別(給NSString擴展了一個方法),該類別的這個方法主要是用於將電話號碼中的"("、")"、" "、"-"過濾掉 26 if ([[p iPhoneStandardFormat] isEqualToString:mobile]) { 27 is = YES; 28 break; 29 } 30 } 31 // firstName、lastName、mobile 同時存在進行修改 32 if (ff && lf && is) { 33 if ([nickname length] > 0) { 34 ABRecordSetValue(people, kABPersonNicknameProperty, (CFStringRef)nickname, NULL); 35 } 36 if (birthday != nil) { 37 ABRecordSetValue(people, kABPersonBirthdayProperty, (CFDataRef)birthday, NULL); 38 } 39 } 40 41 } 42 // 保存修改的通訊錄對象 43 ABAddressBookSave(addressBook, NULL); 44 // 釋放通訊錄對象的內存 45 if (addressBook) { 46 CFRelease(addressBook); 47 } 48 49 }