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!
J'ai trouvé la solution: (contact.phoneNumbers[0].value as! CNPhoneNumber).valueForKey("digits") as! String
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)")
}
}
/* 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!)
}
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
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=""
}
}
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)")
}
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)")
}
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