iOS 9中不推荐使用AddressBook框架的大部分.在新的联系人框架中,documentation只显示如何获取与NSPredicate
匹配的记录,但如果我想要all记录怎么办?
iOS 9中不推荐使用AddressBook框架的大部分.在新的联系人框架中,documentation只显示如何获取与NSPredicate
匹配的记录,但如果我想要all记录怎么办?
其他两个答案都只从装有defaultContainerIdentifier
的容器中加载触点.在用户有多个容器的情况下(即Exchange和iCloud帐户都用于存储联系人),这将仅从配置为默认帐户的帐户加载联系人.因此,它不会按照问题作者的要求加载all个联系人.
相反,您可能想要做的是获取所有容器并迭代它们,以便从每个容器中提取所有联系人.以下代码片段是我们如何在我们的一个应用程序(在SWIFT中)中执行此操作的示例:
lazy var contacts: [CNContact] = {
let contactStore = CNContactStore()
let keysToFetch = [
CNContactFormatter.descriptorForRequiredKeysForStyle(.FullName),
CNContactEmailAddressesKey,
CNContactPhoneNumbersKey,
CNContactImageDataAvailableKey,
CNContactThumbnailImageDataKey]
// Get all the containers
var allContainers: [CNContainer] = []
do {
allContainers = try contactStore.containersMatchingPredicate(nil)
} catch {
print("Error fetching containers")
}
var results: [CNContact] = []
// Iterate all containers and append their contacts to our results array
for container in allContainers {
let fetchPredicate = CNContact.predicateForContactsInContainerWithIdentifier(container.identifier)
do {
let containerResults = try contactStore.unifiedContactsMatchingPredicate(fetchPredicate, keysToFetch: keysToFetch)
results.appendContentsOf(containerResults)
} catch {
print("Error fetching results for container")
}
}
return results
}()