web-dev-qa-db-fra.com

Crash du carnet d'adresses sur iOS 10 bêta

Lorsque vous cliquez sur l'un des contacts du carnet d'adresses (dans mon application), il se bloque sur iOS 10 bêta et fonctionne correctement sur les versions d'iOS 9;

C'est le journal des crashs

*** 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

Et voici le code pour ouvrir le carnet d'adresses dans mon application:

-(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);
    }

}

Il se bloque uniquement sur iOS 10 beta publique.

18
Bangalore

L'API du carnet d'adresses était obsolète dans iOS 9 au profit de la structure plus orientée objet Contacts

Au lieu d'utiliser ABPeoplePickerViewController, déplacez-vous vers CNContactPickerViewController .

11
erdekhayser

Essayez d’utiliser CNContactPickerViewController (iOS9 et versions ultérieures):

Ajoutez ContactsUI.framework, importez le cadre, déclarez le délégué CNContactPickerDelegate.

Implémentez-le (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];

exemple délégué:

- (void)contactPicker:(CNContactPickerViewController *)picker didSelectContactProperty:(CNContactProperty *)contactProperty{ 

    CNPhoneNumber *phoneNumber = contactProperty.value;
    NSString *phoneStr = phoneNumber.stringValue;
}
11
Elad

Ajoutez "Confidentialité - Description de l'utilisation des contacts" à votre info.plist. 

La même question a été soulevée dans les forums Apple. La réponse originale de GWesley est donnée ci-dessous.

Sujet du forum Apple

5
Amith Shaju

iOS 10 n'autorise pas l'accès au contact tant que nous n'avons pas mentionné pourquoi nous l'utilisons.ouvrez votre plist en tant que code source ajoutez le code ci-dessous sous dict.

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

vérifiez si vous avez fourni des clés valides comme 

@[CNContactFamilyNameKey, CNContactGivenNameKey, CNContactPhoneNumbersKey, CNContactEmailAddressesKey]

quand ils demandent à l'objet CNContact.

ex: si vous devez appeler contact.emailAddresses, il doit être fourni à partir du tableau (CNContactEmailAddressesKey).

3
Subhash

IOS 10 nécessite désormais l'autorisation de l'utilisateur pour accéder à la médiathèque, photos, Caméra et autre matériel comme ceux-ci. La solution à cela est d’ajouter leurs clés dans info.plist avec la description pour l’utilisateur que nous sommes comment. En utilisant leurs données, iOS avait déjà besoin d'autorisations pour accéder à microphone, appareil photo et bibliothèque multimédia précédemment (iOS6, iOS7), mais depuis iOS10 les applications planteront si vous ne fournissez pas la description pourquoi vous demandent la permission.

Vous pouvez spécifier une liste de toutes les clés de cacao dans votre fichier Info.plist

Photo:

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

Microphone :

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

Caméra :

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

Ajoutez d’abord NSContactsUsageDescription dans info.plist, puis présentez le contrôleur dans le bloc d’accès aux requêtes AB comme.

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

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)
}

Exemple de délégué

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