3
我對下面的代碼如何通過搜索欄在swift 3中通過電子郵件地址搜索聯繫人?
func getContctFromContactBook(_ completion: @escaping ContactsHandler) {
if contactsStore == nil {
//ContactStore is control for accessing the Contacts
contactsStore = CNContactStore()
}
switch CNContactStore.authorizationStatus(for: CNEntityType.contacts) {
case CNAuthorizationStatus.denied, CNAuthorizationStatus.restricted:
//User has denied the current app to access the contacts.
let productName = Bundle.main.infoDictionary!["CFBundleName"]!
let alert = UIAlertController(title: "Unable to access contacts", message: "\(productName) does not have access to contacts. Kindly enable it in privacy settings ", preferredStyle: UIAlertControllerStyle.alert)
let okAction = UIAlertAction(title: "Ok", style: UIAlertActionStyle.default, handler: { action in
})
alert.addAction(okAction)
case CNAuthorizationStatus.notDetermined:
//This case means the user is prompted for the first time for allowing contacts
contactsStore?.requestAccess(for: CNEntityType.contacts, completionHandler: { (granted, error) -> Void in
//At this point an alert is provided to the user to provide access to contacts. This will get invoked if a user responds to the alert
if (!granted){
DispatchQueue.main.async(execute: {() -> Void in
})
}
else{
}
})
case CNAuthorizationStatus.authorized:
//Authorization granted by user for this app.
var contactsArray = [CNContact]()
let contactFetchRequest = CNContactFetchRequest(keysToFetch: keysToFetch as [CNKeyDescriptor])
do {
try contactsStore?.enumerateContacts(with: contactFetchRequest, usingBlock: { (contact, stop) -> Void in
//Ordering contacts based on alphabets in firstname
contactsArray.append(contact)
})
completion(contactsArray, nil)
}
catch let error as NSError {
print(error.localizedDescription)
}
}
}
獲取從swift3接觸框架的接觸我得到這個代碼的所有聯繫人,但我的問題是,我使用謂詞來搜索電子郵件地址從搜索欄接觸。當我按名稱搜索時,我正在獲取結果,但我不知道如何爲電子郵件地址添加謂詞。我在下面發佈搜索邏輯,請任何一個建議我正確的方式。這是我的搜索邏輯。
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
if (searchText.characters.count > 0)
{
let predicate: NSPredicate
if searchText.characters.count > 0 {
predicate = CNContact.predicateForContacts(matchingName: searchText)
} else {
predicate = CNContact.predicateForContactsInContainer(withIdentifier: contactsStore!.defaultContainerIdentifier())
}
let store = CNContactStore()
do {
filteredContacts = try store.unifiedContacts(matching: predicate,
keysToFetch: allowedContactKeys())
}
catch {
print("Error!")
}
}
else
{
self.filteredContacts = self.contactsArray
}
self.tblContact.reloadData()
}
func allowedContactKeys() -> [CNKeyDescriptor]{
//We have to provide only the keys which we have to access. We should avoid unnecessary keys when fetching the contact. Reducing the keys means faster the access.
return [CNContactEmailAddressesKey as CNKeyDescriptor,
CNContactNamePrefixKey as CNKeyDescriptor,
CNContactGivenNameKey as CNKeyDescriptor,
CNContactFamilyNameKey as CNKeyDescriptor,
CNContactOrganizationNameKey as CNKeyDescriptor,
CNContactBirthdayKey as CNKeyDescriptor,
CNContactImageDataKey as CNKeyDescriptor,
CNContactThumbnailImageDataKey as CNKeyDescriptor,
CNContactImageDataAvailableKey as CNKeyDescriptor,
CNContactPhoneNumbersKey as CNKeyDescriptor,
]
}