Swift 2.1在iOS 9中通过电子邮件搜索联系人

时间:2015-11-20 21:55:34

标签: swift2 ios9

在新的“联系人”框架中,似乎有一种按名称搜索的方法:

left: 0; right: 0; margin: 0 auto;

但是没有明显的方式通过电子邮件搜索我可以在文档或搜索中找到。

如何通过电子邮件地址搜索联系人?

这些文章herehere有助于学习新框架,但这些文章都没有透露如何通过电子邮件进行搜索。

1 个答案:

答案 0 :(得分:1)

遇到同样的问题,我设法找到了解决方案。我通过获取所有联系人然后迭代它们来找到匹配的联系人来解决这个问题。

代码肯定可以重构。

import UIKit
import Contacts

public class ContactFinder: NSObject {

    private lazy var store = CNContactStore()
    private var allContacts: [CNContact] = []
    private let keysToFetch: [CNKeyDescriptor] = [CNContactEmailAddressesKey, CNContactPhoneNumbersKey, CNContactFamilyNameKey, CNContactGivenNameKey, CNContactPostalAddressesKey, CNContactBirthdayKey, CNContactImageDataKey, CNContactImageDataAvailableKey]

    public func requestAccess(completion:((success: Bool, error: NSError?)->())) {

        let status = CNContactStore.authorizationStatusForEntityType(.Contacts)

        if status == .NotDetermined {
            store.requestAccessForEntityType(.Contacts, completionHandler: { [weak self](success, error) -> Void in
                if success {
                    self?.getAllContacts(completion)
                } else {
                    completion(success: false, error: error)
                }
            })
        } else if status == .Authorized {
            getAllContacts(completion)
        } else {
            completion(success: false, error: nil)
        }
    }

    public func searchForContactUsingEmail(email: String, completion:((contacts: [CNContact])->())) {
        var contacts: [CNContact] = []
        for contact in allContacts {
            let em = contact.emailAddresses

            if em.count > 0 {
                let results = em.filter({ val in
                    let ce = (val.value as! String).trimmedString.lowercaseString

                    return ce == email.trimmedString.lowercaseString
                })

                if results.count > 0 {
                    contacts.append(contact)
                }
            }
        }

        completion(contacts: contacts)
    }

    private func getAllContacts(completion:((success: Bool, error: NSError?)->())) {
        let request = CNContactFetchRequest(keysToFetch: keysToFetch)
        request.predicate = nil
        request.unifyResults = true

        do {
            try store.enumerateContactsWithFetchRequest(request, usingBlock: { [weak self](contact, _) -> Void in
                self?.allContacts.append(contact)
                })
        } catch let e as NSError {
            print(e.localizedDescription)
            completion(success: false, error: e)
            return
        }

        completion(success: true, error: nil)
    }

}