在ios Swift中获取所有联系人?

我知道的ios swift有一个联系人框架 ,我可以获取联系人,但我找不到任何方法来获取所有的联系人,我可以访问该数组中的每个联系人。 提取联系人的所有方法似乎都需要某种条件。 有什么方法可以把所有的联系人联系起来吗?

谢谢

联系框架问题的许多答案build议迭代各种容器(帐户)。 但是,苹果的文档描述了一个“统一联系人”

代表同一个人的不同账户中的联系人可以自动链接在一起。 链接的联系人在OS X和iOS应用程序中显示为统一联系人。 统一联系人是合并到一个联系人中的一组链接联系人的内存中暂时视图。

默认情况下联系人框架返回统一联系人。 每个获取的统一联系人(CNContact)对象都具有其自己的唯一标识符,该标识符与链接联系人组中的任何个人联系人标识符不同。 统一联系人的重新提取应该使用其标识符来完成。 资源

获取单个数组中的(部分,基于键)联系人列表的最简单方法如下:

var contacts = [CNContact]() let keys = [CNContactFormatter.descriptorForRequiredKeysForStyle(.FullName)] let request = CNContactFetchRequest(keysToFetch: keys) do { try self.contactStore.enumerateContactsWithFetchRequest(request) { (contact, stop) in // Array containing all unified contacts from everywhere contacts.append(contact) } } catch { print("unable to fetch contacts") } 
  // You may add more "keys" to fetch referred to official documentation let keysToFetch = [CNContactFormatter.descriptorForRequiredKeysForStyle(.FullName)] // The container means // that the source the contacts from, such as Exchange and iCloud var allContainers: [CNContainer] = [] do { allContainers = try store.containersMatchingPredicate(nil) } catch { print("Error fetching containers") } var contacts: [CNContact] = [] // Loop the containers for container in allContainers { let fetchPredicate = CNContact.predicateForContactsInContainerWithIdentifier(container.identifier) do { let containerResults = try store.unifiedContactsMatchingPredicate(fetchPredicate, keysToFetch: keysToFetch) // Put them into "contacts" contacts.appendContentsOf(containerResults) } catch { print("Error fetching results for container") } } 

Swift 4.我创build了PhoneContacts类。

  import Foundation import ContactsUI class PhoneContacts { class func getContacts(filter: ContactsFilter = .none) -> [CNContact] { let contactStore = CNContactStore() let keysToFetch = [ CNContactFormatter.descriptorForRequiredKeys(for: .fullName), CNContactPhoneNumbersKey, CNContactEmailAddressesKey, CNContactThumbnailImageDataKey] as [Any] var allContainers: [CNContainer] = [] do { allContainers = try contactStore.containers(matching: nil) } catch { Debug.Log(message: "Error fetching containers") } var results: [CNContact] = [] for container in allContainers { let fetchPredicate = CNContact.predicateForContactsInContainer(withIdentifier: container.identifier) do { let containerResults = try contactStore.unifiedContacts(matching: fetchPredicate, keysToFetch: keysToFetch as! [CNKeyDescriptor]) results.append(contentsOf: containerResults) } catch { Debug.Log(message: "Error fetching containers") } } return results } } 

在另一个类中调用上面的方法

 func phoneNumberWithContryCode() -> [String] { let contacts = PhoneContacts.getContacts() // here calling the getContacts methods var arrPhoneNumbers = [String]() for contact in contacts { for ContctNumVar: CNLabeledValue in contact.phoneNumbers { if let fulMobNumVar = ContctNumVar.value as? CNPhoneNumber { //let countryCode = fulMobNumVar.value(forKey: "countryCode") get country code let MccNamVar = fulMobNumVar.value(forKey: "digits") as? String { arrPhoneNumbers.append(MccNamVar) } } } } return arrPhoneNumbers // here array has all contact numbers. } 

现在,获取联系人的电子邮件和电话

 enum ContactsFilter { case none case mail case message } var phoneContacts = [PhoneContact]() // array of PhoneContact var filter: ContactsFilter = .none self.loadContacts(filter: filter) // Calling loadContacts methods fileprivate func loadContacts(filter: ContactsFilter) { phoneContacts.removeAll() var allContacts = [PhoneContact]() for contact in PhoneContacts.getContacts(filter: filter) { allContacts.append(PhoneContact(contact: contact)) } var filterdArray = [PhoneContact]() if self.filter == .mail { filterdArray = allContacts.filter({ $0.email.count > 0 }) // getting all email } else if self.filter == .message { filterdArray = allContacts.filter({ $0.phoneNumber.count > 0 }) } else { filterdArray = allContacts } phoneContacts.append(contentsOf: filterdArray) DispatchQueue.main.async { self.tableView.reloadData() } } }