1. ホーム
  2. ios

iOS 9でContacts Frameworkを使用してすべての連絡先レコードを取得する方法

2023-09-06 22:26:28

質問

iOS 9 では、AddressBook フレームワークのほとんどの部分が非推奨になりました。新しい連絡先フレームワークでは ドキュメント にマッチするレコードをフェッチする方法だけが示されています。 NSPredicate にマッチするレコードを取得する方法を示していますが、もし 全て が必要な場合は?

どのように解決するには?

他の回答はいずれも、コンテナからコンタクトをロードする際に defaultContainerIdentifier . ユーザーが複数のコンテナを持っている場合 (たとえば、Exchange と iCloud アカウントが両方とも連絡先の保存に使用されている場合)、デフォルトとして設定されているアカウントから連絡先を読み込むだけです。したがって すべて の連絡先を読み込むことはできません。

おそらく代わりに行いたいことは、すべてのコンテナを取得し、それらを反復して、それぞれのコンテナからすべての連絡先を抽出することでしょう。次のコードスニペットは、私たちのアプリの1つでそれを行う方法の例です(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
}()