web-dev-qa-db-fra.com

Comment obtenir un ou plusieurs numéros de téléphone CNContact sous forme de chaîne dans Swift?

J'essaie de récupérer les noms et les numéros de téléphone de tous les contacts et de les mettre dans des tableaux avec Swift dans iOS. Je l'ai fait jusqu'ici:

func findContacts() -> [CNContact] {

    marrContactsNumber.removeAllObjects()
    marrContactsName.removeAllObjects()

    let store = CNContactStore()

    let keysToFetch = [CNContactGivenNameKey, CNContactFamilyNameKey, CNContactPhoneNumbersKey]

    let fetchRequest = CNContactFetchRequest(keysToFetch: keysToFetch)

    var contacts = [CNContact]()

    do {
        try store.enumerateContactsWithFetchRequest(fetchRequest, usingBlock: { (let contact, let stop) -> Void in
            contacts.append(contact)

            self.marrContactsName.addObject(contact.givenName + " " + contact.familyName)

            self.marrContactsNumber.addObject(contact.phoneNumbers)

            print(contact.phoneNumbers)
    }
    catch let error as NSError {
        print(error.localizedDescription)
    }

    print(marrContactsName.count)
    print(marrContactsNumber.count)

    return contacts
}

Une fois terminé, marrContactsName contient un tableau de tous les noms de mes contacts exactement comme prévu. c'est-à-dire "John Doe". Cependant, marrContactsNumber renvoie un tableau de valeurs comme

[<CNLabeledValue: 0x158a19950: identifier=F831DC7E-5896-420F-AE46-489F6C14DA6E,
label=_$!<Work>!$_, value=<CNPhoneNumber: 0x158a19640: countryCode=us, digits=6751420000>>,
<CNLabeledValue: 0x158a19a80: identifier=ECD66568-C6DD-441D-9448-BDEDDE9A68E1,
label=_$!<Work>!$_, value=<CNPhoneNumber: 0x158a199b0: countryCode=us, digits=5342766455>>]

Je voudrais savoir comment récupérer JUSTE le (s) numéro (s) de téléphone sous forme de valeur (s) de chaîne, c'est-à-dire "XXXXXXXXXX". Fondamentalement, comment appeler la valeur du ou des chiffres. Merci!

29
Baylor Mitchell

J'ai trouvé la solution: (contact.phoneNumbers[0].value as! CNPhoneNumber).valueForKey("digits") as! String

33
Baylor Mitchell

tu peux recevoir contact.phoneNumbers de CNLabeledValue :

for phoneNumber in contact.phoneNumbers {
  if let number = phoneNumber.value as? CNPhoneNumber,
      let label = phoneNumber.label {
      let localizedLabel = CNLabeledValue.localizedStringForLabel(label)
      print("\(localizedLabel)  \(number.stringValue)")
  }
}
18
Telember
/* Get only first mobile number */

    let MobNumVar = (contact.phoneNumbers[0].value as! CNPhoneNumber).valueForKey("digits") as! String
    print(MobNumVar)

/* Get all mobile number */

    for ContctNumVar: CNLabeledValue in contact.phoneNumbers
    {
        let MobNumVar  = (ContctNumVar.value as! CNPhoneNumber).valueForKey("digits") as? String
        print(MobNumVar!)
    }

 /* Get mobile number with mobile country code */

    for ContctNumVar: CNLabeledValue in contact.phoneNumbers
    {
        let FulMobNumVar  = ContctNumVar.value as! CNPhoneNumber
        let MccNamVar = FulMobNumVar.valueForKey("countryCode") as? String
        let MobNumVar = FulMobNumVar.valueForKey("digits") as? String

        print(MccNamVar!)
        print(MobNumVar!)
    }
14
Sujay U N

Voici une solution que j'ai utilisée avec Swift 4.

func addPhoneNumber(_ contact: CNContact) {

    var numbers: [String] = []

    let validTypes = [
        CNLabelPhoneNumberiPhone,
        CNLabelPhoneNumberMobile,
        CNLabelPhoneNumberMain
    ]

    let validNumbers = contact.phoneNumbers.compactMap { phoneNumber -> String? in
        if let label = phoneNumber.label, validTypes.contains(label) {
            return phoneNumber.value.stringValue
        }
        return nil
    }

    guard numbers.count > 0 else {
        return
    }

    // process/use your numbers for this contact here
    DispatchQueue.main.async {
        self.sendSMSText(numbers)
    }
}

Vous pouvez trouver les valeurs disponibles pour le tableau validTypes dans le fichier d'en-tête CNPhoneNumber.

Elles sont:

CNLabelPhoneNumberiPhone
CNLabelPhoneNumberMobile
CNLabelPhoneNumberMain
CNLabelPhoneNumberHomeFax
CNLabelPhoneNumberWorkFax
CNLabelPhoneNumberOtherFax
CNLabelPhoneNumberPager
3
digitalHound

Voici comment vous le faites dans Swift 4

func contactPicker(_ picker: CNContactPickerViewController, didSelect contactProperty: CNContactProperty) {

    if let phoneNo = contactProperty.value as? CNPhoneNumber{
        txtPhone.text = phoneNo.stringValue
    }else{
        txtPhone.text=""
    }
}
1
1394

La définition d'un CNLabeledValue :

La classe CNLabeledValue est une classe thread-safe qui définit un objet de valeur immuable qui combine une valeur de propriété de contact avec une étiquette. Par exemple, un numéro de téléphone de contact peut avoir une étiquette Domicile, Travail, iPhone, etc.

CNContact.phoneNumbers est un tableau de CNLabeledValues ​​et chaque CNLabeledValue a une étiquette et une valeur.

Pour imprimer les numéros de téléphone correspondant à un CNContact, vous pouvez essayer:

for phoneNumber in contact.phoneNumbers {
    print("The \(phoneNumber.label) number of \(contact.givenName) is: \(phoneNumber.value)")
}
1
Emptyless

Dans Swift 3 vous pouvez obtenir directement

 if item.isKeyAvailable(CNContactPhoneNumbersKey){
        let phoneNOs=item.phoneNumbers
        let phNo:String
        for item in phoneNOs{
            print("Phone Nos \(item.value.stringValue)")
        }
1
Mahesh Giri

Swift"_$!<Mobile>!$_" Cet article est écrit pour créer de la différence ainsi que pour donner l'opportunité de s'appuyer sur diverses options.

for con in contacts
{
    for num in con.phoneNumbers
    {
        if num.label == "_$!<Mobile>!$_"    //Please Don't Change this!
        {
            self.contactNames.append(con.givenName)
            self.contactNums.append(num.value.stringValue)
            break
        }
        else
        {
            continue
        }
    }
}

Ici nous avons num.value.stringValue

0
dev_shanghai