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.
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;
}
La API de la libreta de direcciones quedó en desuso en iOS 9 en favor del marco de contactos más orientado a objetos.
En lugar de utilizar ABPeoplePickerViewController, vaya a CNContactPickerViewController .
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
}