В моем приложении я сохраняю телефонные номера пользователей, которые они мне дают, чтобы другие могли их найти и найти свои контакты в приложении. Но у меня возникают проблемы при разборе телефонных номеров, потому что пользователи могут сохранять телефонные номера разными способами:
- Код страны, код города, номер: +1 (код города) xxx-xxxx
- Код страны, номер: +1 xxx-xxxx
- Номер: xxx-xxxx
Я могу сохранить номер пользователя, добавив код города и номер в виде одного длинного номера и сохранив код страны отдельно. Я попытался проанализировать телефонные номера, взятые из Контактов, чтобы имитировать, как я сохранил номера, но это не работает. Есть ли что-то, что мне не хватает? Я скопировал код внизу:
if accessGranted {
let contactStore = CNContactStore()
let keys = [CNContactPhoneNumbersKey]
let request = CNContactFetchRequest(keysToFetch: keys as [CNKeyDescriptor])
do {
try contactStore.enumerateContacts(with: request, usingBlock: { (contact, error) in
let phoneNumberRaw = contact.phoneNumbers.first?.value.stringValue ?? ""
var phoneNumberRawArray = phoneNumberRaw.components(separatedBy: " ")
var phoneString = ""
if phoneNumberRawArray.count >= 3 { //probably has country code in the front
//remove country code
phoneNumberRawArray.removeFirst()
}
//add to phone string
for phone in phoneNumberRawArray {
phoneString.append(phone)
}
phoneString = phoneString.replacingOccurrences(of: "(", with: "")
phoneString = phoneString.replacingOccurrences(of: " ", with: "")
phoneString = phoneString.replacingOccurrences(of: ")", with: "")
phoneString = phoneString.replacingOccurrences(of: "-", with: "")
self.contactsPhoneNumbers.append(phoneString)
//get country code
for ContactNumber:CNLabeledValue in contact.phoneNumbers
{
let fullNumber = ContactNumber.value
let countryCode = fullNumber.value(forKey: "countryCode") as? String
self.contactsCountryCode.append(countryCode!)
}
})
}
catch {
print("Unable to get contacts")
}
}