Recupera todos los numbers de teléfono de contactos en iOS

Hasta ahora he visto methods para get múltiples numbers de teléfono si muestro un selector para que el usuario pueda seleccionar personas y luego get el número de teléfono. Lo que quiero es recuperar los numbers de todos los contactos. ¿Es incluso posible?

Prueba esto funciona para iOS 6 y iOS 5.0 o anterior :

Ejemplo de demostración de proyecto

Primero agregue los siguientes frameworks en Link Binary With Libraries

  • AddressBookUI.framework
  • Libreta de direcciones.framework

Luego importar

#import <AddressBook/ABAddressBook.h> #import <AddressBookUI/AddressBookUI.h> 

Luego usa el siguiente código

Solicitud de 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]; } 

Recuperación de 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; 

Más reference Leer Apple Docs

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

 <key>NSContactsUsageDescription</key> <string>Write the reason why your app needs the contact.</string> 

Para get la image del usuario.

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

NOTA:

El marco de la libreta de direcciones está en desuso en iOS 9 y se sustituye por el Marco de contactos nuevo y mejorado

  • AddressBookUI.framework
  • Libreta de direcciones.framework

    Estos 2 frameworks están en desuso en iOS 9

    —> Apple presentó

  • Marco de contacto
  • ContactUI Framework

Aquí se carga Código usando los últimos frameworks.

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

 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 loggings

 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]; } 

Obtenga 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 count que algunas personas tienen 20,000 contactos en su teléfono. Si planea hacer esto, probablemente tendrá que multithread el process.

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