Как получить номер(ы) телефона CNContact в виде строки в Swift?
Я пытаюсь получить имена и номера телефонов всех контактов и поместить их в массивы с Swift в iOS. Я дошел до этого:
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
}
после окончания marrContactsName
содержит массив имен всех моих контактов точно так, как ожидалось. т. е. "Вася Пупкин". Однако,marrContactsNumber
возвращает массив значений типа
[<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>>]
Я хотел бы знать, как получить только номер(ы) телефона в качестве строкового значения(ов), т. е. "XXXXXXXXXX". В основном, как позвонить значение цифры(цифр). Спасибо!
8 ответов
вы можете узнать contact.phoneNumbers
С 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!)
}
определение a CNLabeledValue:
класс CNLabeledValue является потокобезопасным классом, который определяет объект неизменяемого значения, объединяющий значение свойства контакта с меткой. Например, контактный номер телефона может иметь метку дома,работы, iPhone и т. д.
CNContact.phoneNumbers-это массив CNLabeledValues, и каждый CNLabeledValue имеет метку и значение.
для печати номеров телефонов в соответствии с CNContact вы можете попробовать:
for phoneNumber in contact.phoneNumbers {
print("The \(phoneNumber.label) number of \(contact.givenName) is: \(phoneNumber.value)")
}
в swift 3 Вы можете получить direclty
if item.isKeyAvailable(CNContactPhoneNumbersKey){
let phoneNOs=item.phoneNumbers
let phNo:String
for item in phoneNOs{
print("Phone Nos \(item.value.stringValue)")
}
Swift 3
"_$!<Mobile>!$_"
этот элемент написан, чтобы создать разницу, а также положить часть возможности полагаться на различные варианты.
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
}
}
}
здесь мы имеем num.value.stringValue
вот как вы это делаете в swift 4
func contactPicker(_ picker: CNContactPickerViewController, didSelect contactProperty: CNContactProperty) {
if let phoneNo = contactProperty.value as? CNPhoneNumber{
txtPhone.text = phoneNo.stringValue
}else{
txtPhone.text=""
}
}
вот решение, которое я использовал с 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)
}
}
вы можете найти доступные значения для validTypes
массив в заголовочном файле CNPhoneNumber.
Они:
CNLabelPhoneNumberiPhone
CNLabelPhoneNumberMobile
CNLabelPhoneNumberMain
CNLabelPhoneNumberHomeFax
CNLabelPhoneNumberWorkFax
CNLabelPhoneNumberOtherFax
CNLabelPhoneNumberPager