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
}()

Ios相关问答推荐

无法在所有窗口上方显示图像

SWIFT-仅解码感兴趣的元素

如何在不将应用程序留在SwiftUI上的情况下更改语言?

带菜单的选取器不适用于Int32,但适用于Int

安装新版本 XCode 15.0 后无法运行应用程序 XCode

Task.cancel() 的 TaskPriority 的区别

具有线性渐变的 SVG textPath 在 Safari 中损坏

帧过渡动画有条件地工作

SwiftUI - 在ForEach的每个元素之间自动添加分隔符

通过隐藏和显示视图在 iMessage 应用程序中使用不同的视图

SwiftUI:添加核心数据项时更新选项卡栏徽章

每次运行后,Xcode 6 都会在 iOS8 模拟器中重命名我的应用程序目录.

未找到签名证书​​iOS Distribution

NSPredicate 用于测试 NULL 和空白字符串

如何在 Swift 中将新单元格插入 UITableView

如何识别导航堆栈中的前一个视图控制器

在 Objective-C 中将所有文本转换为小写

使用 Swift 在一个 ViewController 中强制横向模式

使用 Xcode 的 All Exceptions 断点时忽略某些异常

值/对象的 NSDictionary 键?