2015-10-11 15 views
7

Ho un'app per iOS che deve accedere al controller di visualizzazione del selettore di contatti per consentire all'utente di selezionare una proprietà di contatto come l'indirizzo e-mail/i numeri di telefono degli indirizzi di posta elettronica.Estrazione di e-mail da CNContactProperty - iOS 9

Il problema che sto avendo ora, è che non riesco a capire come analizzare i dati restituiti. Ho utilizzato il metodo contactPicker didSelectContactProperty, ma non sono in grado di analizzare i dati di cui ho bisogno.

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

    CNLabeledValue *test = contactProperty.contact.emailAddresses.firstObject; 
    NSLog(@"%@", test); 

    NSLog(@"%@", contactProperty.contact.phoneNumbers); 
} 

Se si esegue il codice di cui sopra si ottiene la seguente risposta:

2015-10-11 13:30:07.059 Actions[516:212765] <CNLabeledValue: 0x13656d090: identifier=21F2B1B2-8158-466B-9224-E2036CA07D28, label=_$!<Other>!$_, [email protected]> 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>>") 

Thats grande, ma come faccio a estrarre i dati che ho bisogno da esso? Perché le istruzioni NSLog restituiscono i dati in un formato strano?

Grazie per il tuo tempo, Dan.

risposta

14

I valori restituiti sono della classe CNLabeledValue. Al fine di ottenere il valore da loro, per, diciamo, le e-mail, fare questo

CNLabeledValue *emailValue = contactProperty.contact.emailAddresses.firstObject; 
NSString *emailString = email.value; 

Se il valore si voleva un numero di telefono, questo è come si dovrebbe recuperare che

CNLabeledValue *phoneNumberValue = contactProperty.contact.phoneNumbers.firstObject; 
CNPhoneNumber *phoneNumber = phoneNumberValue.value; 
NSString *phoneNumberString = phoneNumber.stringValue; 

Perché il valore restituito è un CNLabeledValue, si è anche in grado di recuperare il numero di telefono o l'etichetta di e-mail

NSString *emailLabel = emailValue.label; //This may be 'Work', 'Home', etc. 
NSString *phoneNumberLabel = phoneNumberValue.label; 
+0

Ah, giusto vedo. Grazie mille. Ho appena aggiornato l'utilizzo del vecchio framework AddressBook, quindi mi sono trovato in difficoltà. Grazie ancora :) – Supertecnoboff

+1

Solo una domanda, mi aspetto che l'utente possa selezionare un indirizzo email di un numero di telefono. Come posso verificare ciò che hanno selezionato? – Supertecnoboff

+2

Penso che quell'informazione sarebbe memorizzata in 'contactProperty.value',' contactProperty.label', 'contactProperty.key', ecc. Testerei ognuno di questi e vedremo cosa emette, come non l'ho mai usato prima personalmente. –

0
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

Per 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 

}