Developer's Blog

iOS 標準の連絡先情報をアプリから利用する

今週リリースした FlickAddress (App Store) は、iPhone 標準の連絡先情報をグループ管理できるようになっています。すでに iPhone に登録されている連絡先情報はそのまま FlickAddress でも扱えますし、FlickAddress で情報やグループを編集すれば、標準の連絡先アプリにも反映されます。

このように標準の連絡先データベースを利用するための API が iOS に標準で搭載されている AddressBook フレームワークです。さらに、連絡先の表示・編集等の UI を表示するための AddressBook UI フレームワークも用意されています。

今回は FlickAddress のリリースを記念して、これら 2 つのフレームワークの概要を紹介しましょう。

Address Book フレームワーク

Address Book フレームワークは、iOS 標準の連絡先情報にアクセスするための C 言語の API です。C 言語とはいえ、Core Foundation 風のオブジェクト指向の設計になっています。この API を利用すれば、連絡先について例えば次のような操作ができます。

  • 連絡先情報の追加・削除・検索
  • 個々の連絡先情報の氏名・電話番号などの参照・追加・変更
  • グループの追加・変更・削除
  • 連絡先のグループ割り当ての変更

具体的には、次のようなデータ構造を通じてアクセスします。

  • ABAddressBook : 連絡先データベースに対応
  • ABPerson : 個々の連絡先に対応
  • ABGroup : グループに対応

ABPerson と ABGroup は共通のスーパータイプとして ABRecord を持ち、プロパティの読み書きなどは ABRecord レベルで実現されています。たとえば、ABPerson から名字を取得する場合は、次のようなコードになります。

ABPersonRef person; // 参照が設定されているとする。
CFStringRef lastName = ABRecordCopyValue(person, kABPersonLastNameProperty);

Address Book フレームワークは、iOS と基盤を同じくする Mac OS X にも用意されていますが、構成は若干異なります。

Address Book UI フレームワーク

連絡先の選択・表示・編集といった一般的な UI を表示するための UIKit ベースのクラスが揃っています。現在あるのは 4 つの View Controller クラスです。これらに ABPerson など Address Book フレームワークのデータを与えてやることで、簡単に表示画面を作れます。

  • ABNewPersonViewController : 新規連絡先用の画面
  • ABPeoplePickerNavigationController : 連絡先の選択画面
  • ABPersonViewController : 連絡先の表示・編集・アクション(電話発信など)用の画面
  • ABUnknownPersonViewController : 未確定の連絡先情報の画面

これらのクラスはそれぞれの delegate プロトコルがあり、たとえば、連絡先の表示画面で電話番号をタップしたら何が起こるかを delegate 先で変更したりできるようになっています。

iOS の連絡先は”氏名”や”住所”はもちろん’誕生日”や”役職”など多様な情報を保持するので、自分で表示・編集用のビューを作るのは大変ですが、ABPersonViewController を使えば簡単です。ABPersonViewController では、例えば「電話番号のみ表示する」のように何を表示するかを変更できます。ABPersonViewController は「編集」ボタンを押したときの”あの動き”もすべてやってくれます。ありがたいですね。

Address Book および Address Book UI フレームワークを使えば、連絡先情報の表示や編集機能は比較的簡単にアプリに組み込めます。とはいえ、FlickAddress の特徴はその UI はあるわけで、そのためにいろいろと苦労しています。いずれ機会があれば、そのあたりのお話も紹介させていただきます。

参考

Apple による Address Book / Address Book UI フレームワークのドキュメントです。参考にしてください。

Copyright © 2019 Fenrir Inc. All rights reserved.