7
votes

Extraire Email de CNContactProperty - iOS 9

J'ai une application iOS qui a besoin d'accéder au contrôleur de sélection de sélecteur de contacts afin de permettre à l'utilisateur de sélectionner une propriété de contact telle que l'adresse e-mail / numéros de téléphone des adresses e-mail d'imessage.

Le problème que j'ai en ce moment , est que je ne peux pas comprendre comment analyser les données retournées. J'ai utilisé le ContactPickerCickerContactProperty code>, mais je ne suis pas en mesure d'analyser les données dont j'ai besoin. P> xxx pré>

Si vous exécutez le code ci-dessus. Obtenez la réponse suivante: P>

2015-10-11 13:30:07.059 Actions[516:212765] <CNLabeledValue: 0x13656d090: identifier=21F2B1B2-8158-466B-9224-E2036CA07D28, label=_$!<Other>!$_, value=News_Europe@iEUNS.com> 2015-10-11 13:30:07.061 App_Name[516:212765] (
    "<CNLabeledValue: 0x13672a500: identifier=6697A0E9-3B91-4566-B26E-83B87979F816, label=_$!<Main>!$_, value=<CNPhoneNumber: 0x13672a660: countryCode=gb, digits=08000391010>>" )


0 commentaires

4 Réponses :


14
votes

Les valeurs retournées sont du CNLABeledValue classe. Afin d'obtenir la valeur d'eux, pour, par exemple, les courriels, faites ce xxx

si la valeur que vous vouliez un numéro de téléphone, c'est ainsi que vous récupéreriez que < Pré> xxx

car la valeur renvoyée est un cnlabeledvalue , vous pouvez également récupérer le numéro de téléphone ou l'étiquette de la messagerie xxx < / p>


11 commentaires

Ah juste je vois. Merci beaucoup. Je viens de passer à partir de l'utilisation de l'ancien cadre d'adresse, alors je me suis battu avec cela. Merci encore :)


Une seule question, j'attends que l'utilisateur sélectionne soit une adresse électronique d'un numéro de téléphone. Comment puis-je vérifier ce qu'ils ont sélectionné?


Je pense que ces informations seraient stockées dans ContactProperty.value , ContactProperty.label , ContactProperty.key , etc. Je vais tester chacun de ces Et voyez ce qu'il génère, comme je l'ai jamais utilisé cela avant personnellement.


Génial, contactProperty.key fonctionne parfaitement. Merci chris :)


Je promets que ce sera ma dernière question, mais savez-vous s'il y a une sorte de indexpath.row numéroté que je peux utiliser? (Au lieu de emailaddresses.firstObject ). Donc, je pouvais faire e-mailaddresses [indénitation.row] .


Si vous voulez dire que vous avez besoin de l'index de l'adresse e-mail sélectionnée, je pense que ContactProperty.value pointe vers l'email et que, par conséquent, vous n'avez pas besoin d'utiliser le courrier électronique tableau.


Ah juste je vois. Brillant, je promets que je ne voudrais plus vous gêner. Merci :)


Hey @chrisloonam, quand j'essaie d'obtenir l'étiquette de cnlabeledvalue Je reçois un texte comme celui-ci: " $! ! $ "


Oui, j'ai obtenu ce résultat, mais je veux obtenir uniquement des courriels de travail, pas d'autres courriels comme à la maison et etc.


Pour obtenir des étiquettes correctement localisées au lieu de cordes comme "$! ! $", Utilisez ce code: [CNLABeledValue localiséStringForLabel: [Etiquette de Phonenumbervalue]];


Cela fonctionnerait-il toujours si vous avez plusieurs adresses et que l'utilisateur a sélectionné autre chose que la première adresse?



0
votes
Here is swift version of Chris answer :

 func fatchContacts(store : CNContactStore)  {
    do
    {
    let groups = try store.groups(matching: nil)
    let predicate =  CNContact.predicateForContactsInGroup(withIdentifier: groups[0].identifier)
    //let predicate = CNContact.predicateForContactsMatchingName("John")
        let keyToFatch = [CNContactFormatter.descriptorForRequiredKeys(for: .fullName ) ,CNContactEmailAddressesKey] as [Any]
    let contacts = try store.unifiedContacts(matching: predicate, keysToFetch: keyToFatch as! [CNKeyDescriptor])            //------------------------------------------------------
   //-------------Get Here-----------------------------------------
     print(contacts)
     print(contacts[0])
        let formatter = CNContactFormatter ()
        print(formatter.string(from: contacts[0]))
        print(contacts[0].givenName)
        print(contacts[0].emailAddresses)
        let emailValue : CNLabeledValue = contacts[0].emailAddresses.first!;
        let  email = emailValue.value
        print(email)




    }
    catch{

    }
}


Just pass the CNContactStore object        

0 commentaires

1
votes

pour SWIFT 3.0:

 public func contactPicker(_ picker: CNContactPickerViewController, didSelect contact: CNContact)
{
      if let emailValue : CNLabeledValue = contact.emailAddresses.first
    {
        txtEmail.text = emailValue.value as String
    }
    if let phoneNumber : CNLabeledValue = contact.phoneNumbers.first
    {
        txtMobno.text = phoneNumber.value.stringValue
    }
     txtFname.text = contact.givenName + " " + contact.familyName

}


0 commentaires

1
votes

Malheureusement, la réponse de Chris vous indique comment obtenir la valeur de l'objet CnLabeledValue renvoyé, mais cela ne vous indique pas comment identifier ce que CnlabeledValue a été sélectionné en fonction du paramètre ContactProperty les fonctionnalités de fonction.

Ce que vous devez faire est de faire du vélo à travers chacune des adresses électroniques du contact et de vérifier si l'identifiant correspond à l'identifiant de contact sélectionné. Utilisez le code suivant à l'intérieur de la fonction DidSelectContactProperty: xxx

Remarque Je n'ai testé que ce code avec des adresses postales, il peut donc nécessiter une modification supplémentaire de fonctionner avec des adresses électroniques.


0 commentaires