仅显示右 phone 号码的联系人(联系人框架)

Display only contacts with right phone number (Contacts Framework)

我只想显示具有特定 phone 号码的联系人。 phone 个数字写在一个数组中。我不知道如何只显示这些联系人。因此我尝试使用 "predicateForEnablingContact" 方法。 但是使用我的代码,所有联系人都被禁用,即使是那些号码正确的联系人。我正在使用联系人框架。将不胜感激。

func picker () {
    let numbers = ["555","8885555512"]
    let pick = CNContactPickerViewController()
    pick.displayedPropertyKeys = [CNContactPhoneNumbersKey]
   pick.predicateForEnablingContact = NSPredicate(format: "phoneNumbers = %@", argumentArray: numbers)
    pick.delegate = self
    presentViewController(pick, animated: true, completion: nil)
}
func contactPicker(picker: CNContactPickerViewController, didSelectContacts contacts: [CNContact]) {
    let Kontakte = contacts
    print(Kontakte)
    dismissViewControllerAnimated(true, completion: nil)
}

此代码 returns 仅在给定集合中具有 phone 号码的联系人:

let numbers = Set(["555","8885555512"])

let predicate = NSPredicate { (evaluatedObject, bindings) -> Bool in
    guard let evaluatedContact = evaluatedObject as? CNContact else { return false }
    return Set(evaluatedContact.phoneNumbers.map{ return ([=10=].value as! CNPhoneNumber).stringValue }).intersect(numbers).count > 0
}

请注意 numbers 是一个集合。这是为了稍后使用 intersect 方法。 intersect 用于确定联系人是否与给定号码共享任何 phone 号码;如果是,则谓词结果为 true.

我使用了KPKContacts

调用这个方法就这么简单

var contacts: [KPKContact]()
let contactStore = KPKContactStore()
//make sure you implement the delegate method that will notify contact authorisation changes
contactStore.delegate = self

self.kpkContactStore.findContactsWithValidNumbersOnly(){
    kpkContacts in
    if let contacts = kpkContacts {
        self.contacts = contacts
        self.tableView.reloadData()
    }
}

它带有默认正则表达式 phone 格式为 ### ### ###, ###-###-###, (###) ### 的数字-####, #-###-###-###, ###-###-###, #########

您也可以从正则表达式资源中获取自己的正则表达式,并在此方法中编辑 PHONE_REGEX 属性

private var regexPhoneNumberValidatorBlock: String -> Bool = { value in
let PHONE_REGEX = "^\s*(?:\+?(\d{1,3}))?[-. (]*(\d{3})[-. )]*(\d{3})[-. ]*(\d{4})(?: *x(\d+))?\s*$"
    let phoneTest = NSPredicate(format: "SELF MATCHES %@", PHONE_REGEX)
    let result =  phoneTest.evaluateWithObject(value)
    return result
}