2016-05-28 6 views
2

Новое для контактов, пытающихся получить номер мобильного телефона. У меня есть адрес электронной почты, но не могу найти мобильный телефон. Это то, что я получил. Часть, отмеченная **, я ошибаюсь.Как получить номер телефона из рамки «Контакты»

if let oldContact = self.contactItem { 
    let store = CNContactStore() 

    do { 
     let mykeysToFetch = [CNContactFormatter.descriptorForRequiredKeysForStyle(.FullName), CNContactEmailAddressesKey, CNContactPostalAddressesKey,CNContactImageDataKey, CNContactImageDataAvailableKey,CNContactPhoneNumbersKey] 
     let contact = try store.unifiedContactWithIdentifier(oldContact.identifier, keysToFetch: mykeysToFetch) 

     dispatch_async(dispatch_get_main_queue(), {() -> Void in 
      if contact.imageDataAvailable { 
       if let data = contact.imageData { 
        self.contactImage.image = UIImage(data: data) 
       } 
      } 

      self.fullName.text = CNContactFormatter().stringFromContact(contact) 
      self.email.text = contact.emailAddresses.first?.value as? String 
      self.phoneNumber.text = contact.phoneNumbers.first?.value as? String 

      **if contact.isKeyAvailable(CNContactPhoneNumbersKey){ 
       if let phoneNum = contact.phoneNumbers.first?.value as? String { 
        self.phoneNumber.text = phoneNum as String 
       } 

      }** 

      if contact.isKeyAvailable(CNContactPostalAddressesKey) { 
       if let postalAddress = contact.postalAddresses.first?.value as? CNPostalAddress { 
        self.address.text = CNPostalAddressFormatter().stringFromPostalAddress(postalAddress) 
       } else { 
        self.address.text = "No Address" 
       } 
      } 
     }) 
    } catch { 
     print(error) 
    } 
} 

ответ

4

Если вы хотите получить список мобильных телефонов для контакта, вы смотрите на phoneNumbers, который является массивом CNLabeledValue, и найти те, с label из CNLabelPhoneNumberMobile или CNLabelPhoneNumberiPhone.

Например, вы могли бы сделать что-то вроде:

let mobilePhoneLabels = Set<String>(arrayLiteral: CNLabelPhoneNumberMobile, CNLabelPhoneNumberiPhone, "cell", "mobile") // use whatever you want here; you might want to include a few strings like shown here to catch any common custom permutations user may have used 

let mobileNumbers = contact.phoneNumbers.filter { mobilePhoneLabels.contains($0.label) && $0.value is CNPhoneNumber } 
    .map { ($0.value as! CNPhoneNumber).stringValue } 

Итак, если вы хотите первый:

let mobileNumber = mobileNumbers.first ?? "" // or use `if let` syntax 

Или, если вы хотите строковое представление списка из них:

let mobileNumberString = mobileNumbers.joinWithSeparator(" ; ") 

Что вы делаете с этим массивом мобильных номеров, зависит от вас, но, надеюсь, это иллюстрирует b асическая идея.

+0

В чем разница между меткой и CNLabeledValue? –

+0

«CNLabeledValue» - это объект, который состоит из «метки» (например, «домашний», «рабочий», «мобильный» и т. Д., Они обычно кодируются с использованием констант «CNLabelPhoneNumber ...», чтобы максимизировать совместимость с локализацией, хотя они также могут состоять из простых строк) и «value» («CNPhoneNumber» самого номера). См. Https://developer.apple.com/library/ios/documentation/Contacts/Reference/CNLabeledValue_Class/index.html. – Rob

+0

Спасибо за помощь :) –