ios contacts addressbook ios10

Contacto Bloqueo de la libreta de direcciones en iOS 10 beta



contacts addressbook (8)

IOS 10 ahora requiere permiso de usuario para acceder a la biblioteca multimedia, fotos, cámara y otro hardware como estos. La solución para esto es agregar sus claves en info.plist con una descripción para el usuario de cómo usamos sus datos, iOS ya requería permisos para acceder al micrófono, la cámara y la biblioteca de medios (iOS6, iOS7), pero desde iOS10, las aplicaciones se bloqueará si no proporciona la descripción del motivo por el que solicita el permiso.

Hay una lista de todas las claves de cacao que puede especificar en su archivo Info.plist

Foto:

Key : Privacy - Photo Library Usage Description Value : $(PRODUCT_NAME) photo use

Micrófono

Key : Privacy - Microphone Usage Description Value : $(PRODUCT_NAME) microphone use

Camara

Key : Privacy - Camera Usage Description Value : $(PRODUCT_NAME) camera use

Cuando se hace clic en cualquier contacto en la libreta de direcciones (dentro de mi aplicación), se bloquea en iOS 10 beta y funciona bien en versiones de iOS 9;

Este es el registro de fallos

*** Terminating app due to uncaught exception ''CNPropertyNotFetchedException'', reason: ''A property was not requested when contact was fetched.'' *** First throw call stack: (0x1cf11a07 0x1c62af63 0x1cf1194d 0x246f0f4f 0x246c6a71 0x1ce355eb 0x1ce2e19b 0x246c69cf 0x246c6883 0x25e4a375 0x2538f283 0x254204ef 0x25420bb1 0xe9da97 0xe9da83 0xea2321 0x1cecf18f 0x1cecd477 0x1ce1e6bd 0x1ce1e549 0x1e54ebfd 0x21f961e3 0x21f90947 0x966c9 0x1ca9e507) libc++abi.dylib: terminating with uncaught exception of type NSException

Y aquí está el código para abrir la libreta de direcciones dentro de mi aplicación:

-(void)showContactPicker { __weak RecieverSelectorViewController *weakSelf = self; ABPeoplePickerNavigationController* picker = [[ABPeoplePickerNavigationController alloc] init]; picker.peoplePickerDelegate = self; picker.modalPresentationStyle = UIModalPresentationFullScreen; picker.modalTransitionStyle = UIModalPresentationPopover; [self presentViewController:picker animated:YES completion:^{ [weakSelf hideLoadingAnimation]; // animation to show view controller has completed. }]; } - (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker didSelectPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier { [self setSelectedPerson:person]; } - (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController*)peoplePicker didSelectPerson:(ABRecordRef)person { [self setSelectedPerson:person]; } -(void)setSelectedPerson:(ABRecordRef)person { NSString *contactName = CFBridgingRelease(ABRecordCopyCompositeName(person)); ABMultiValueRef phoneRecord = ABRecordCopyValue(person, kABPersonPhoneProperty); CFStringRef phoneNumber = ABMultiValueCopyValueAtIndex(phoneRecord, 0); self.isSenderReciever = NO; NSString *phone = [PorterUtils extraLast10DigitsFromDigitString:[PorterUtils extractNumberFromText:(__bridge_transfer NSString *)phoneNumber]]; //Handling Social Media Contacts - Crash if(contactName.length>0 && phone.length>0){ [self setRecieverName:contactName number:phone]; CFRelease(phoneRecord); } }

Se está estrellando solo en iOS 10 beta pública.


Agregue "Privacidad - Descripción del uso de contactos" a su info.plist.

La misma pregunta fue planteada en los foros de Apple. La respuesta original de GWesley se da a continuación.

Hilo del foro de Apple


Compruebe si ha proporcionado claves válidas como

@[CNContactFamilyNameKey, CNContactGivenNameKey, CNContactPhoneNumbersKey, CNContactEmailAddressesKey]

Cuando están solicitando desde CNContact objeto.

Por ejemplo, si necesita llamar a contact.emailAddresses debe proporcionarse desde la matriz (CNContactEmailAddressesKey).


Intente usar CNContactPickerViewController (iOS9 y superior):

Agregue ContactsUI.framework, importe el marco, declare el delegado CNContactPickerDelegate.

Implementarlo (en Objective-C):

CNContactPickerViewController *peoplePicker = [[CNContactPickerViewController alloc] init]; peoplePicker.delegate = self; NSArray *arrKeys = @[CNContactPhoneNumbersKey]; //display only phone numbers peoplePicker.displayedPropertyKeys = arrKeys; [self presentViewController:peoplePicker animated:YES completion:nil];

delegado de ejemplo:

- (void)contactPicker:(CNContactPickerViewController *)picker didSelectContactProperty:(CNContactProperty *)contactProperty{ CNPhoneNumber *phoneNumber = contactProperty.value; NSString *phoneStr = phoneNumber.stringValue; }



Primero agregue NSContactsUsageDescription en info.plist y luego presente el controlador en el bloque de acceso de solicitud AB como.

ABAddressBookRequestAccessWithCompletion(contactPicker, { success, error in if success { self.presentViewController(self.contactPicker, animated: true, completion: nil) } })


iOS 10 no permite el acceso al contacto hasta que mencionemos por qué lo estamos utilizando. Abra su plist como código fuente agregue el siguiente código bajo dict. Ahora ejecútelo nuevamente.

<key>NSContactsUsageDescription</key> <string>$(PRODUCT_NAME) uses Contact</string>


Swift 3

// This example allows the display and selection of email addresses only. if #available(iOS 9.0, *) { let picker = CNContactPickerViewController() let arrKeys = [CNContactEmailAddressesKey] // array of properties to display picker.displayedPropertyKeys = arrKeys picker.delegate = self present(picker, animated: true, completion: nil) }

Ejemplo de delegado

@available(iOS 9.0, *) func contactPicker(_ picker: CNContactPickerViewController, didSelect contactProperty: CNContactProperty) { let emailAddress = contactProperty.value as? String }