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