Как быстро получить только мобильные номера с помощью CNContacts?

У меня есть код для получения всех телефонных номеров в контактах пользователей, но я хотел бы отфильтровать только мобильные номера. В настоящее время я просто делаю это, добавляя в массив только числа с первой цифрой «+» или второй цифрой «7», как показано ниже:

    func findContacts () -> [CNContact]{
    let keysToFetch = [CNContactFormatter.descriptorForRequiredKeysForStyle(.FullName),CNContactPhoneNumbersKey]
    let fetchRequest: CNContactFetchRequest = CNContactFetchRequest(keysToFetch: keysToFetch)
    var contacts = [CNContact]()
    CNContact.localizedStringForKey(CNLabelPhoneNumberiPhone)
    fetchRequest.mutableObjects = false
    fetchRequest.unifyResults = true
    fetchRequest.sortOrder = .UserDefault

    let contactStoreID = CNContactStore().defaultContainerIdentifier()

    do {

        try CNContactStore( ).enumerateContactsWithFetchRequest(fetchRequest) { (let contact, let stop) -> Void in
            if contact.phoneNumbers.count > 0 {
                contacts.append(contact)
            }
            if (contact.isKeyAvailable(CNContactPhoneNumbersKey)) {
                for phoneNumber:CNLabeledValue in contact.phoneNumbers {
                    let number = phoneNumber.value as! CNPhoneNumber
                    print(number.stringValue)
                    let index = number.stringValue.startIndex.advancedBy(1)
                    let indexPlus = number.stringValue.startIndex.advancedBy(0)
                    if number.stringValue[index] == Character(String(7)) || number.stringValue[indexPlus] == Character("+"){
                        self.allNumbers.append("\(number.stringValue)")
                    }
                }
            }
        }

Поскольку контакты хранятся на iPhone с пометкой «мобильный», мне было интересно, можно ли добавить в массив только эти номера. Спасибо :)


person R_McVities    schedule 04.05.2016    source источник


Ответы (3)


Проверьте, является ли ярлык номера мобильным, следующим образом:

var mobiles = [CNPhoneNumber]()

for num in contact.phoneNumbers {
    let numVal = num.value as! CNPhoneNumber
    if num.label == CNLabelPhoneNumberMobile {
        mobiles.append(numVal)
    }
}

Затем у вас есть массив номеров мобильных телефонов этого человека.

person brimstone    schedule 04.05.2016
comment
Не кодируйте "mobile". Используйте CNLabelPhoneNumberMobile или CNLabelPhoneNumberiPhone. Но имейте в виду, что это не будет получать все мобильные номера. Люди могут использовать настраиваемые ярлыки при добавлении номера телефона. Кто-то может по ошибке использовать домашний ярлык или любое другое количество возможностей. Или пользователь может использовать мобильную метку на стационарном телефоне. В конце концов, нет никакого способа убедиться, что какой-либо данный номер действительно является номером мобильного телефона. - person rmaddy; 05.05.2016

Лучший способ сделать это упоминается в этом посте, где вы используете flatMap и contains. Оптимизация вложенного фильтра Swift?

person Harsh    schedule 14.02.2017

Еще один способ привлечь больше посетителей:

for con in contacts
 {
    for num in con.phoneNumbers
      {
         if num.label == "_$!<Mobile>!$_"
             {
                self.contactNames.append(con.givenName)
                self.contactNums.append(num.value.stringValue)
                    break
                       }
         else
            {
                   continue
            }
         }

  }
person dev_shanghai    schedule 23.02.2017