Recuperar todos los números de teléfono de contactos en iOS

Hasta el momento, vi métodos para obtener varios números de teléfono si mostraba un selector para que el usuario pueda seleccionar personas y luego obtener el número de teléfono. Lo que quiero es recuperar todos los números de los contactos. ¿Es posible?

Pruebe esto, funciona para iOS 6 y iOS 5.0 o anterior :

Ejemplo de demostración del proyecto

Primero agregue los siguientes marcos en Link Binary With Libraries

  • AddressBookUI.framework
  • AddressBook.framework

Luego importar

#import  #import  

Luego usa el siguiente código

Solicitar permiso para acceder a la libreta de direcciones

 ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, NULL); __block BOOL accessGranted = NO; if (&ABAddressBookRequestAccessWithCompletion != NULL) { // We are on iOS 6 dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) { accessGranted = granted; dispatch_semaphore_signal(semaphore); }); dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); dispatch_release(semaphore); } else { // We are on iOS 5 or Older accessGranted = YES; [self getContactsWithAddressBook:addressBook]; } if (accessGranted) { [self getContactsWithAddressBook:addressBook]; } 

Recuperando contactos de la libreta de direcciones

 // Get the contacts. - (void)getContactsWithAddressBook:(ABAddressBookRef )addressBook { contactList = [[NSMutableArray alloc] init]; CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople(addressBook); CFIndex nPeople = ABAddressBookGetPersonCount(addressBook); for (int i=0;i < nPeople;i++) { NSMutableDictionary *dOfPerson=[NSMutableDictionary dictionary]; ABRecordRef ref = CFArrayGetValueAtIndex(allPeople,i); //For username and surname ABMultiValueRef phones =(__bridge ABMultiValueRef)((__bridge NSString*)ABRecordCopyValue(ref, kABPersonPhoneProperty)); CFStringRef firstName, lastName; firstName = ABRecordCopyValue(ref, kABPersonFirstNameProperty); lastName = ABRecordCopyValue(ref, kABPersonLastNameProperty); [dOfPerson setObject:[NSString stringWithFormat:@"%@ %@", firstName, lastName] forKey:@"name"]; //For Email ids ABMutableMultiValueRef eMail = ABRecordCopyValue(ref, kABPersonEmailProperty); if(ABMultiValueGetCount(eMail) > 0) { [dOfPerson setObject:(__bridge NSString *)ABMultiValueCopyValueAtIndex(eMail, 0) forKey:@"email"]; } //For Phone number NSString* mobileLabel; for(CFIndex j = 0; j < ABMultiValueGetCount(phones); j++) { mobileLabel = (__bridge NSString*)ABMultiValueCopyLabelAtIndex(phones, j); if([mobileLabel isEqualToString:(NSString *)kABPersonPhoneMobileLabel]) { [dOfPerson setObject:(__bridge NSString*)ABMultiValueCopyValueAtIndex(phones, j) forKey:@"phone"]; } else if ([mobileLabel isEqualToString:(NSString*)kABPersonPhoneIPhoneLabel]) { [dOfPerson setObject:(__bridge NSString*)ABMultiValueCopyValueAtIndex(phones, j) forKey:@"phone"]; break ; } } [contactList addObject:dOfPerson]; } NSLog(@"Contacts = %@",contactList); } 

Para recuperar otra información

 // All Personal Information Properties kABPersonFirstNameProperty; // First name - kABStringPropertyType kABPersonLastNameProperty; // Last name - kABStringPropertyType kABPersonMiddleNameProperty; // Middle name - kABStringPropertyType kABPersonPrefixProperty; // Prefix ("Sir" "Duke" "General") - kABStringPropertyType kABPersonSuffixProperty; // Suffix ("Jr." "Sr." "III") - kABStringPropertyType kABPersonNicknameProperty; // Nickname - kABStringPropertyType kABPersonFirstNamePhoneticProperty; // First name Phonetic - kABStringPropertyType kABPersonLastNamePhoneticProperty; // Last name Phonetic - kABStringPropertyType kABPersonMiddleNamePhoneticProperty; // Middle name Phonetic - kABStringPropertyType kABPersonOrganizationProperty; // Company name - kABStringPropertyType kABPersonJobTitleProperty; // Job Title - kABStringPropertyType kABPersonDepartmentProperty; // Department name - kABStringPropertyType kABPersonEmailProperty; // Email(s) - kABMultiStringPropertyType kABPersonBirthdayProperty; // Birthday associated with this person - kABDateTimePropertyType kABPersonNoteProperty; // Note - kABStringPropertyType kABPersonCreationDateProperty; // Creation Date (when first saved) kABPersonModificationDateProperty; // Last saved date // All Address Information Properties kABPersonAddressProperty; // Street address - kABMultiDictionaryPropertyType kABPersonAddressStreetKey; kABPersonAddressCityKey; kABPersonAddressStateKey; kABPersonAddressZIPKey; kABPersonAddressCountryKey; kABPersonAddressCountryCodeKey; 

Referencia adicional Leer documentos de Apple

ACTUALIZACIÓN: debe agregar una descripción de por qué necesita acceder a los contactos en su Apps-Info.plist

Privacy - Contacts Usage Description

O

 NSContactsUsageDescription Write the reason why your app needs the contact. 

Para obtener la imagen del usuario.

 UIImage *contactImage; if(ABPersonHasImageData(ref)){ contactImage = [UIImage imageWithData:(__bridge NSData *)ABPersonCopyImageData(ref)]; } 

NOTA:

El marco de la libreta de direcciones está obsoleto en iOS 9 y reemplazado por el nuevo y mejorado marco de contactos

  • AddressBookUI.framework
  • AddressBook.framework

    Estos 2 marcos están en desuso en iOS 9

    —> Apple presentó

  • Marco de contacto
  • Marco de trabajo de la interfaz de usuario

Aquí está el código cargado usando los últimos marcos.

Obtenga permiso para la libreta de direcciones o notifique al usuario que necesita cambiar el permiso en su configuración.

 CGFloat iOSVersion = [[[UIDevice currentDevice] systemVersion] floatValue]; if(iOSVersion >= 6.0) { // Request authorization to Address Book addressBookRef = ABAddressBookCreateWithOptions(NULL, NULL); if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusNotDetermined) { ABAddressBookRequestAccessWithCompletion(addressBookRef, ^(bool granted, CFErrorRef error) { //start importing contacts if(addressBookRef) CFRelease(addressBookRef); }); } else if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusAuthorized) { // The user has previously given access, add the contact //start importing contacts if(addressBookRef) CFRelease(addressBookRef); } else { // The user has previously denied access // Send an alert telling user to change privacy setting in settings app UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Unable to Access" message:@"Grant us access now!" delegate:self cancelButtonTitle:@"Not Now" otherButtonTitles:@"I'll Do It!", nil]; [alert show]; if(addressBookRef) CFRelease(addressBookRef); } } else { addressBookRef = ABAddressBookCreate(); //start importing contacts if(addressBookRef) CFRelease(addressBookRef); } 

Obtener los registros

 CFArrayRef records = ABAddressBookCopyArrayOfAllPeople(addressBook); NSArray *contacts = (__bridge NSArray*)records; CFRelease(records); for(int i = 0; i < contacts.count; i++) { ABRecordRef record = (__bridge ABRecordRef)[contacts objectAtIndex:i]; } 

Obtener el número de teléfono

  ABMultiValueRef phonesRef = ABRecordCopyValue(recordRef, kABPersonPhoneProperty); if(phonesRef) { count = ABMultiValueGetCount(phonesRef); for(int ix = 0; ix < count; ix++){ CFStringRef typeTmp = ABMultiValueCopyLabelAtIndex(phonesRef, ix); CFStringRef numberRef = ABMultiValueCopyValueAtIndex(phonesRef, ix); CFStringRef typeRef = ABAddressBookCopyLocalizedLabel(typeTmp); NSString *phoneNumber = (__bridge NSString *)numberRef; NSString *phoneType = (__bridge NSString *)typeRef; if(typeTmp) CFRelease(typeTmp); if(numberRef) CFRelease(numberRef); if(typeRef) CFRelease(typeRef); } CFRelease(phonesRef); } 

Tenga en cuenta que algunas personas tienen 20,000 contactos en su teléfono. Si planeas hacer esto, probablemente tendrás que procesar varias veces el proceso.

Seguro que puede. Primero, deberá obtener el permiso del usuario para hacerlo. Si no lo hace, el usuario tendrá que autorizar manualmente su aplicación desde la configuración. Hay un gran ejemplo sobre cómo recuperar todos los números de teléfono, nombres, direcciones, etc. ‘ aquí .