1

我目前可以从联系人应用程序中获取联系人,但我面临的问题是我需要能够选择要导入到我的应用程序的联系人,如果联系人有超过 1 个电话号码,我总是得到第一个数字,这是我正在使用的代码:

func contactPicker(_ picker: CNContactPickerViewController, didSelect contactProperty: CNContactProperty) {

    let numbers     = contactProperty.contact.phoneNumbers.first
    let firstName   = contactProperty.contact.givenName
    let lastName    = contactProperty.contact.familyName
    let phoneNumber = (numbers?.value)?.stringValue ?? ""

    /// Duplicate phone numbers will not be saved
    if phoneNumbers.contains(phoneNumber) {
        return
    }
    /// Saving selected contact in Core Data
    CoreDataManager.sharedInstance.savePhoneNumberInCoreData(FirstName: firstName, LastName: lastName, PhoneNumber: phoneNumber)

    DispatchQueue.main.async { [weak self] in
        self?.tableView.reloadData()
    }
}

线的问题:

contactProperty.contact.phoneNumbers.first

有两个选项仅适用于contactProperty.contact.phoneNumbers .first.last

如果有类似的东西.selected,它将解决问题。

4

3 回答 3

0

您可以使用一个叫做主电话号码的东西

var phoneNumber: String?

if let mainNumber = numbers.first(where: { $0.label == CNLabelPhoneNumberMain }) {
    phoneNumber = mainNumber.value.stringValue
} else {
    phoneNumber = numbers.first?.value.stringValue //or some other default value
}

请注意,我将定义更改numbers为电话号码数组

let numbers = contactProperty.contact.phoneNumbers

完整代码:

func contactPicker(_ picker: CNContactPickerViewController, didSelect contactProperty: CNContactProperty) {

    let numbers = contactProperty.contact.phoneNumbers    
    var phoneNumber: String?

    if let mainNumber = numbers.first(where: { $0.label == CNLabelPhoneNumberMain }) {
        phoneNumber = mainNumber.value.stringValue
    } else {
        phoneNumber = numbers.first?.value.stringValue //or some other default value
    }

    if phoneNumber == nil || phoneNumbers.contains(phoneNumber) {
        return
    }

    let firstName = contactProperty.contact.givenName
    let lastName = contactProperty.contact.familyName   

    CoreDataManager.sharedInstance.savePhoneNumberInCoreData(FirstName: firstName, LastName: lastName, PhoneNumber: phoneNumber)

    DispatchQueue.main.async { [weak self] in
        self?.tableView.reloadData()
    }
}
于 2019-09-03T11:34:20.253 回答
0

我同意 Joakim Danielson 的解决方案。

但是还有另一种解决方案可以获取存储在手机号码中的特定电话号码,如家庭、手机、传真等。

从联系人获取所有号码并枚举每个号码并检查标记值。请参阅以下代码。

let numbers = contact.phoneNumbers

numbers.forEach { (c) in

    if let label = c.label {

        let localizedLabel = CNLabeledValue<NSCopying & NSSecureCoding>.localizedString(forLabel: label)
        print("\(localizedLabel)")

        switch localizedLabel.lowercased() {

        case "home":
            let homeNumber = c.value
            break

        case "mobile":
            let mobileNumber = c.value
            break

        default:
            break
        }
    }
}
于 2019-09-03T11:54:18.443 回答
0

contactProperty.contactsCNContact是对所选属性的反向引用,位于...

每个属性都由 CNContactProperty 的一个实例表示,该实例提供一个可以包含三个或五个值的元组,具体取决于该属性是否是标记值数组的成员。 CNCContactProperty

因此,您应该直接使用属性的 Information var

例如,phoneNumbers 属性是标记值数组的成员,因此 CNContactProperty 元组包含联系人、键、值、标识符和标签。

CNCContactProperty

注意:我从阅读另一个 SO 答案中了解到这一点,但我现在似乎找不到它。如果合适,可以这样欺骗或编辑,

于 2020-08-05T00:46:19.843 回答