【Swift UIKit】CNContactで連絡先と連携させて情報を取得する方法!

この記事からわかること
- SwiftのUIKitでContactsフレームワークを使ってユーザーの連絡先と連携する方法
- 連絡先の氏名や誕生日などを取得するには?
- CNContactやCNContactFetchRequestクラスの使い方
- 取得できる情報のキー(CNKeyDescriptor)の種類
- CNMutableContactとCNSaveRequestを使った連絡先の追加方法
- テーブルビューへの組み込み方法
index
[open]
\ アプリをリリースしました /
SwiftのContactsフレームワークを導入して標準の連絡先との連携方法をまとめていきます。
Contactsフレームワークとは?
ContactsフレームワークとはiOSアプリ開発において、ユーザーの連絡先情報に、連絡先への連携や操作を可能にできるユーザーインターフェースを提供しているフレームワークです。
Xcodeには既に導入されているフレームワークなのでimport
を記述することで簡単に導入することが可能です。
info.plistへのキー追加
Contactsを用いることでユーザーの連絡先に、開発したアプリからアクセスすることができますが、その前に開発するアプリのinfo.plistへのキー:NSContactsUsageDescriptionの追加が必要になります。NSCalendarsUsageDescription
とキーに入力するとPrivacy - Contacts Usage Description
と自動変換されます。

キーを追加していないとアプリがクラッシュしてしまうので注意してください。
連絡先ではなく、カレンダーアプリやリマインダーなどにアクセスするためのEventKitフレームワークも用意されています。基本的な使い方は同じなので導入してみてください。
Contactsの仕組み
ContactsではCNContactStore
(コンタクトストア)クラスとして連絡先へのアクセスをサポートしています。
このコンタクトストアごとにアクセスへの許可や操作などを行います。複数インスタンス化することもできますが、アプリ内では1つのインスタンスを生成し、そのインスタンスごとに許可申請や操作をしないとエラーの元になるので注意してください。
requestAccessで許可申請
連絡先へのアクセスはユーザーの許可がないとアクセスすることはできません。申請を出すにはインスタンス化したEKEventStoreからrequestAccess
メソッドを呼び出してポップアップを表示させユーザーへ許可を申請します。
authorizationStatusでステータスを取得
許可申請を出す前に現在の許可状態を取得し、未許可であれば申請を出すようにします。authorizationStatus
からCNAuthorizationStatus
型の現在の許可状態が取得できるのでnotDetermined
(未申請)の場合のみ申請を出すようにしておきます。
公式リファレンス:authorizationStatusメソッド
使用しやすくするために独自のContactControllerクラスを用意してContactsを定義しておきます。許可申請や連絡先の取得などを関数などにまとめて呼び出しやすいようにしておきました。
連絡先データの取得
- 取得したい情報のキーを定義
- CNContactFetchRequestクラスにキーを渡して取得リクエストを作成
- enumerateContactsメソッドで連絡先を取得
- 一連の処理はバックグラウンドスレッドで実行
連絡先取得の1連の操作はバックグラウンドスレッドの実行が公式よりオススメされているようです。
”連絡先ストアは、すべての I/O 操作をカプセル化し、連絡先とグループの取得と保存を担当します。連絡先ストア メソッドは同期的であるため、バックグラウンド スレッドで使用することをお勧めします。”
取得したい情報のキーを定義
連絡先の情報を取得するにはあらかじめ取得したい情報のキーを定義しておきます。キーの全ての種類は以下の公式ページを参照してください。
例えば以下は名前(姓名)と誕生日、電話番号を取得したい時のキー定義です。
CNContactFetchRequestクラス
公式リファレンス:CNContactFetchRequestクラス
キー定義ができたらCNContactFetchRequest
クラスを使ってリクエストオブジェクトを生成します。引数には取得したい連絡先情報のキーを渡します。
enumerateContactsメソッド
公式リファレンス:enumerateContactsメソッド
実際に連絡先を取得するにはenumerateContacts
メソッドを使用します。引数に先程定義したリクエスト情報を渡し、引数block
内でマッチする連絡先ごとに連絡先情報にアクセスできます。
throws
キーワードがついているのでtry
文でエラーキャッチができる
ようにしておきます。
連絡先データの追加
- CNSaveRequestオブジェクトを生成
- CNMutableContactオブジェクトに個人情報を格納
- リクエストに個人情報を追加
- コンタクトストアからリクエストを実行
テーブルビューに表示させてみる
これで連絡先の情報を取得/追加できるようになったのでテーブルビューに当てはめて表示させていきます。

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。