Отсутствующие контакты в ABAddressBookCopyArrayOfAllPeople

Я пытаюсь найти номер телефона в адресной книге из своего приложения, и я был удивлен, что не нашел его. Дело в том, что я напечатал все номера моей адресной книги в консоли, к которой обращается мое приложение, и странно, что некоторые контакты отсутствуют, я сравнивал вывод с моей адресной книгой, их немного, но все же.

Вот как я получаю доступ к адресной книге:

 ABAddressBookRef addressBook = ABAddressBookCreate();
 NSArray *people = (NSArray *)   ABAddressBookCopyArrayOfAllPeople(addressBook);

 BOOL found = NO;
 NSString *name;
 int i = 0;
 while (!found) {//Here I print all the contact info, name and phone number
       ABRecordRef person = (ABRecordRef)[people objectAtIndex:i];
       ABMultiValueRef multi = ABRecordCopyValue(person, kABPersonPhoneProperty);
       NSLog(@"el telf: %@ y nombre %@",tempPhone2, [NSString stringWithFormat:@"%@ %@",ABRecordCopyValue(person, kABPersonFirstNameProperty) ? (NSString *)ABRecordCopyValue(person, kABPersonFirstNameProperty) : @"",ABRecordCopyValue(person, kABPersonLastNameProperty) ? (NSString *)ABRecordCopyValue(person, kABPersonLastNameProperty) : @""]);                           
      if([[key objectForKey:@"phone"] isEqualToString:tempPhone2]){
           found = YES;          
      }
 }

Любая идея, почему я не получаю доступ ко всем контактам в моей адресной книге?

[EDIT] Самое странное, что когда я использую ABPeoplePickerNavigationController, появляются эти отсутствующие контакты.


person subharb    schedule 27.11.2012    source источник


Ответы (1)


Пожалуйста, попробуйте следующее.

ABAddressBookRef lAddressBook = ABAddressBookCreate();
CFArrayRef lRawAddressBookEntries =
ABAddressBookCopyArrayOfAllPeople(lAddressBook);
CFIndex lTotalContactsCount = ABAddressBookGetPersonCount(lAddressBook);
for (CFIndex i = 0; i < lTotalContactsCount; i++) {
    ABRecordRef lRef = CFArrayGetValueAtIndex(lRawAddressBookEntries, i);

    ABMultiValueRef phoneNumberProperty = ABRecordCopyValue(lRef, kABPersonPhoneProperty);
    NSArray* phoneNumbers1 = (NSArray*)ABMultiValueCopyArrayOfAllValues(phoneNumberProperty);
    CFRelease(phoneNumberProperty);

    // Do whatever you want with the phone numbers
    if(phoneNumbers1 && [phoneNumbers1 isKindOfClass:[NSArray class]]) {
        for(NSString *stringPhoneNUmber in phoneNumbers1) {
            if([stringPhoneNUmber isEqualToString:tempPhone2]){
                found = YES;
            }
        }
    }
}
person Paramasivan Samuttiram    schedule 27.11.2012
comment
Можете ли вы объяснить, что пошло не так в исходном коде OP? :) - person Flying_Banana; 26.04.2015
comment
Не знаю, что он там упустил, но это просто рабочий код, который я использую в своих проектах. - person Paramasivan Samuttiram; 27.04.2015
comment
Если вы используете ABAddressBookCopyArrayOfAllPeople и ABMultiValueCopyArrayOfAllValues, обязательно CFRelease их (и lAddressBook тоже). Или вы можете использовать CFBridgingRelease для бесплатного соединения с CFArrayRef на NSArray, а затем ARC позаботится об управлении памятью за вас. Но в нынешнем виде этот код приведет к утечке всех контактов, а также всех телефонных номеров. Если вы используете статический анализатор, он должен помочь вам выявить все утечки здесь. - person Rob; 13.10.2015