ios swift ios9 contacts addressbook

ios - ¿Cómo obtener un número de teléfono de CNContact como una cadena en Swift?



ios9 contacts (8)

Aquí hay una solución que usé con Swift 4.

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

Puede encontrar los valores disponibles para la matriz validTypes en el archivo de encabezado CNPhoneNumber.

Son:

func contactPicker(_ picker: CNContactPickerViewController, didSelect contactProperty: CNContactProperty) { if let phoneNo = contactProperty.value as? CNPhoneNumber{ txtPhone.text = phoneNo.stringValue }else{ txtPhone.text="" } }

Estoy intentando recuperar los nombres y números de teléfono de todos los contactos y ponerlos en arreglos con Swift en iOS. He llegado hasta aquí:

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 }

Una vez completado, marrContactsName contiene una matriz de todos los nombres de mis contactos exactamente como se esperaba. es decir, "John Doe". Sin embargo, marrContactsNumber devuelve una matriz de valores como

[<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>>]

Me gustaría saber cómo recuperar SOLO el (los) número (s) de teléfono como un valor de cadena, es decir, "XXXXXXXXXX". Básicamente, cómo llamar para el valor de los dígitos. ¡Gracias!


Así es como lo haces en swift 4.

CNLabelPhoneNumberiPhone CNLabelPhoneNumberMobile CNLabelPhoneNumberMain CNLabelPhoneNumberHomeFax CNLabelPhoneNumberWorkFax CNLabelPhoneNumberOtherFax CNLabelPhoneNumberPager


En Swift 3 puedes conseguir directamente

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


Encontré la solución: (contact.phoneNumbers[0].value as! CNPhoneNumber).valueForKey("digits") as! String (contact.phoneNumbers[0].value as! CNPhoneNumber).valueForKey("digits") as! String


La definición de un CNLabeledValue :

La clase CNLabeledValue es una clase segura para subprocesos que define un objeto de valor inmutable que combina un valor de propiedad de contacto con una etiqueta. Por ejemplo, un número de teléfono de contacto podría tener una etiqueta de Hogar, Trabajo, iPhone, etc.

CNContact.phoneNumbers es una matriz de CNLabeledValues ​​y cada CNLabeledValue tiene una etiqueta y un valor.

Para imprimir los números de teléfono correspondientes a un contacto CNC puede probar:

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


puede obtener contact.phoneNumbers desde 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)") } }


Swift 3 "_$!<Mobile>!$_" Este artículo está escrito para crear una diferencia, así como para brindar una oportunidad de confiar en varias opciones.

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

Aquí tenemos num.value.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!) }