objective-c cómo - ¿La libreta de direcciones iOS 6 no funciona?




2 Answers

Probablemente relacionado con los nuevos controles de privacidad: a partir de iOS 6, en el dispositivo, una aplicación no puede acceder a los contactos del usuario sin su permiso. De la documentación:

En iOS 6.0 y posterior, si la persona que llama no tiene acceso a la base de datos de la libreta de direcciones:

• Para aplicaciones vinculadas con iOS 6.0 y posterior, esta función devuelve NULL.

• Para aplicaciones vinculadas con versiones anteriores de iOS, esta función devuelve una base de datos de solo lectura vacía.

Si no ha visto aparecer la alerta de permisos ("SomeApp desea acceder a sus contactos"), es posible que las API de libreta de direcciones solo asuman que no tienen acceso y fallan silenciosamente; es posible que deba mostrar algo desde el marco AddressBookUI para activarlo.

por samsung

Mi método de recuperación programática de direcciones de correo electrónico desde la Libreta de direcciones ya no parece funcionar en dispositivos con iOS 6. Funcionó en iOS 5 y, curiosamente, todavía funciona en el simulador de iOS 6. ¿Hay alguna forma nueva de recuperar contactos desde la libreta de direcciones de un usuario mediante programación?

ABAddressBookRef addressBook = ABAddressBookCreate();
CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople(addressBook);
CFIndex nPeople = ABAddressBookGetPersonCount(addressBook);

self.contacts = [[NSMutableArray alloc] init];

int contactIndex = 0;
for (int i = 0; i < nPeople; i++) {
    // Get the next address book record.
    ABRecordRef record = CFArrayGetValueAtIndex(allPeople, i);        

    // Get array of email addresses from address book record.
    ABMultiValueRef emailMultiValue = ABRecordCopyValue(record, kABPersonEmailProperty);
    NSArray *emailArray = (__bridge_transfer NSArray *)ABMultiValueCopyArrayOfAllValues(emailMultiValue);

    [self.contacts addObject:emailArray];
}

Para aclarar, lo anterior no falla, simplemente no devuelve resultados. ABAddressBookCopyArrayOfAllPeople está vacío. ¡Gracias!




Intente con esto: se debe otorgar acceso a la libreta de direcciones antes de poder acceder mediante programación. Esto es lo que terminé haciendo.

  #import <AddressBookUI/AddressBookUI.h>

  // Request authorization to Address Book
  ABAddressBookRef addressBookRef = ABAddressBookCreateWithOptions(NULL, NULL);

  if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusNotDetermined) {
    ABAddressBookRequestAccessWithCompletion(addressBookRef, ^(bool granted, CFErrorRef error) {
      // First time access has been granted, add the contact
      [self _addContactToAddressBook];
    });
  }
  else if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusAuthorized) {
    // The user has previously given access, add the contact
    [self _addContactToAddressBook];
  }
  else {
    // The user has previously denied access
    // Send an alert telling user to change privacy setting in settings app
  }



Related

objective-c ios ios6 abaddressbook