2010-11-01 29 views
18

Tôi đang phát triển một ứng dụng đang hiển thị danh bạ trên iPhone.Nhận các mục nhập hợp nhất/hợp nhất từ ​​ABAddressBook

ABAddressBookRef trả về các mục trùng lặp cho một liên hệ chỉ xuất hiện một lần trong ứng dụng danh bạ trên iPhone.

Tìm trên thẻ liên lạc (từ danh bạ trên iPhone), ở phía dưới có phần được gọi là "Liên hệ được liên kết" để rõ ràng là táo "hợp nhất"/"hợp nhất" hai mục này vào cái tôi thấy.

Câu hỏi đặt ra ở đây là cách tốt nhất để bắt chước hành vi tương tự để ứng dụng của tôi sẽ chỉ hiển thị một mục nhập là gì? có API trả về các mục nhập hợp nhất/hợp nhất từ ​​sổ địa chỉ không?

Trả lời

26

Để tạo một danh sách các địa chỉ liên lạc mà kết hợp trong danh bạ liên kết:

Lưu ý: tài liệu tham khảo ABPerson được lưu trữ trong tùy chỉnh Person trường lớp. Tất cả mọi người sau đó được lưu trữ trong một từ điển addressBookDictionary sử dụng recordID của mỗi người làm khóa.


1. Nhận tất cả ABPersons using ABAddressBookCopyArrayOfAllPeople. Lưu trữ những người trong mảngPersonRecords.

2. Lặp lại tất cả ABPersons.


2,1 Nhận một danh sách những người liên quan đối với từng ABPerson. Sử dụng

ABPersonCopyArrayOfAllLinkedPeople (ABRecordRef person);

Nếu không có liên hệ được liên kết, phương pháp này sẽ trả về một mảng bao gồm cả người đó tham chiếu. Vì vậy, nếu mảng trả về có số> 1, người đó đã liên kết với nhau.

2.2 Thêm người được liên kết vào NSMutableSet. Những người được liên kết này sẽ bị bỏ qua và không được xử lý trong các lần lặp lại trong tương lai.

2.3 Tạo cá thể cá nhân cho ABPerson hiện tại.

2.4 Hợp nhất thông tin người được liên kết với cá nhân. Một người được liên kết có thể có số điện thoại khác nhau, vì vậy bạn cần hợp nhất chúng lại với nhau.


NSArray *allPersonRecords = (NSArray *) ABAddressBookCopyArrayOfAllPeople(self.addressBook); 
NSMutableSet *linkedPersonsToSkip = [[NSMutableSet alloc] init]; 

for (int i=0; i<[allPersonRecords count]; i++){ 

    ABRecordRef personRecordRef = [allPersonRecords objectAtIndex:i]; 

    // skip if contact has already been merged 
    // 
    if ([linkedPersonsToSkip containsObject:personRecordRef]) { 
     continue; 
    } 

    // Create object representing this person 
    // 
    Person *thisPerson = [[Person alloc] initWithPersonRef:personRecordRef]; 

    // check if there are linked contacts & merge their contact information 
    // 
    NSArray *linked = (NSArray *) ABPersonCopyArrayOfAllLinkedPeople(personRecordRef); 
    if ([linked count] > 1) { 
     [linkedPersonsToSkip addObjectsFromArray:linked]; 

     // merge linked contact info 
     for (int m = 0; m < [linked count]; m++) { 
      ABRecordRef iLinkedPerson = [linked objectAtIndex:m]; 
      // don't merge the same contact 
      if (iLinkedPerson == personRecordRef) { 
       continue; 
      } 
      [thisPerson mergeInfoFromPersonRef:iLinkedPerson]; 
     } 
    } 
    [self.addressBookDictionary setObject:thisPerson forKey:thisPerson.recordID]; 
    [thisPerson release]; 
    [linked release]; 
} 
[linkedPersonsToSkip release]; 
[allPersonRecords release]; 
+4

hi, bạn có thể mô tả những gì lớp Person chứa trong mã của bạn không? – HarshIT

+1

vâng tôi muốn sử dụng lớp này nhưng làm cách nào tôi có thể lấy nó – khaled

+0

Vui lòng mô tả - Lớp người không tìm thấy .. @MinTsai –

7

Bạn cần phải có một cái nhìn tại một hàm có tên:

CFArrayRef ABPersonCopyArrayOfAllLinkedPeople (ABRecordRef người);

Chức năng này được xác định trong ABPerson.h. Bạn vượt qua trong một ABRecordRef cho một người và hàm trả về một mảng các đối tượng ABRecordRef đại diện cho thẻ sổ địa chỉ được liên kết với người bạn thông qua vào.

  1. Tạo một bản sao có thể thay đổi trong những mảng chứa các sổ địa chỉ các mục được trả về từ ABAddressBookRef. Vì mục đích thảo luận, hãy gọi mảng mới này là "finalContacts".

  2. Lặp lại dãy địa chỉ liên hệ ban đầu.

  3. Đối với mỗi mục nhập trong mảng, hãy gọi hàm ở trên và vượt qua mục nhập hiện tại. Bạn sẽ nhận được một danh sách các đối tượng ABPersonRef được liên kết. Xóa tất cả các mục nhập này khỏi mảng "finalContacts".

  4. Sau khi lặp lại, tất cả các thẻ được liên kết sẽ bị xóa khỏi "finalContacts" và bạn nên để lại danh sách thẻ sổ địa chỉ duy nhất.

+0

âm thanh hội chợ đủ .. nhưng có lẽ chúng ta nên có một cái nhìn vào những gì các điểm tiếp xúc liên kết là tốt cho? – hfossli

+0

cũng loại bỏ "mẹ", "trợ lý" và các liên kết khác hiển thị trong danh sách âm thanh lạ .. (?) – hfossli

+0

@hfossli: 'ABPersonCopyArrayOfAllLinkedPeople (person)' trả về một mảng các bản ghi khác cho cùng một người. Các liên kết đến Người phối ngẫu, Trợ lý, v.v. được trả về bởi 'ABRecordCopyValue (person, kABPersonRelatedNamesProperty)'. –

Các vấn đề liên quan