連絡先の表示と管理は、Google の CardDAV プロトコルを使用して行うことができます。
連絡先はユーザーの Google アカウントに保存されます。ほとんどの Google サービスで連絡先リストにアクセスできます。クライアント アプリケーションで CardDAV API を使用すると、新しい連絡先の作成、既存の連絡先の編集や削除、特定の条件に一致する連絡先を照会できます。
仕様
完全な仕様は実装されていませんが、Apple iOSTM 連絡先や macOS などの多くのクライアントが正しく相互運用する必要があります。
関連する仕様ごとに、Google の CardDAV サポートは次のとおりです。
- rfc2518: Distributed Authoring(WebDAV)の HTTP 拡張機能
- HTTP メソッド
GET
、PUT
、DELETE
、OPTIONS
、PROPFIND
をサポートします。 - HTTP メソッド
LOCK
、UNLOCK
、COPY
、MOVE
、MKCOL
はサポートされていません。 - 任意の(ユーザー定義の)WebDAV プロパティはサポートされません。
- WebDAV アクセス制御(rfc3744)をサポートしていない。
- HTTP メソッド
- rfc5995: POST を使用して WebDAV コレクションにメンバーを追加する
- ID を指定せずに新しい連絡先を作成できます。
- rfc6352: CardDAV: ウェブ分散型オーサリングとバージョニング(vDAV)への vCard 拡張機能
- HTTP メソッド
REPORT
をサポートしますが、すべての定義済みレポートが実装されているわけではありません。 - プリンシパル コレクションと連絡先コレクションを提供できます。
- HTTP メソッド
- rfc6578: WebDAV のコレクション同期
- クライアント アプリは、最初の同期後にこのオペレーション モードに切り替える必要があります。
- rfc6749: OAuth 2.0 認可フレームワークと rfc6750: OAuth 2.0 認可フレームワーク: 署名なしトークンの使用
- OAuth 2.0 HTTP 認証を使用した CardDAV クライアント プログラムの認証をサポートします。その他の認証方法はサポートされていません。連絡先データのセキュリティのため、CardDAV 接続では HTTPS を使用する必要があります。
- rfc6764: カレンダー拡張機能を WebDAV(CalDAV)に、vCard 拡張機能を WebDAV(CardDAV)に拡張するサービスを見つける
- CardDAV URL のブートストラップは rfc6764 のセクション 6 に従って行う必要があります。
- CardDAV 仕様と CalDAV 仕様間で共有される caldav-ctag-02: Calendar Collection Entity Tag (CTag) in CalDAV をサポートします。連絡先
ctag
はリソースETag
に似ています。連絡先アドレス帳内の情報が変更されると、変更されます。これにより、クライアント プログラムは変更された連絡先を同期する必要がないと迅速に判断できます。 - Google では、連絡先のエンコード形式として VCard 3.0 を使用します。rfc6350: VCard 3.0 をご覧ください。
Google の CardDAV を使用するには OAuth 2.0 が必要です
Google の CardDAV インターフェースには OAuth 2.0 が必要です。OAuth 2.0 を使用して Google API にアクセスする方法については、以下のリンク先のドキュメントをご覧ください。
Google の CardDAV サーバーに接続する
CardDAV プロトコルを使用すると、アドレス帳と連絡先リソースの URI を検出できます。URI はハードコードしないでください。ハードコードはいつでも変更できるからです。
クライアント アプリケーションでは HTTPS を使用し、ユーザーの Google アカウントに対して OAuth 2.0
認証を行う必要があります。CardDAV サーバーは、Google アカウントの OAuth 2.0 認証により HTTPS 経由で到着し、アプリケーションが DevConsole に登録されない限り、リクエストを認証しません。Basic 認証を使用して HTTP 経由で接続しようとすると、またはメールアドレスとパスワードが Google アカウントと一致しない場合は、HTTP 401 Unauthorized
レスポンス コードが返されます。
CardDAV を使用するには、クライアント プログラムが最初に HTTP PROPFIND
を実行して、正規のディスカバリパスに接続する必要があります。
https://www.googleapis.com/.well-known/carddav
アドレスブック リソースにリダイレクト(HTTP 301
)されたら、クライアント プログラムはそれに対して PROPFIND
を実行して、DAV:current-user-principal
、DAV:principal-URL
、addressbook-home-set
のプロパティを検出できます。クライアント プログラムは、addressbook-home-set
で PROPFIND
を実行し、addressbook
リソースと collection
リソースを探すことで、プリンシパルのアドレス帳を見つけることができます。このプロセスの詳細については、このドキュメントで説明しません。詳細については、rfc6352 をご覧ください。
既知の URI の PROPFIND
を介して HTTP 301
レスポンスで返されるリダイレクト パスは、(rfc6764 に従って)永続的にキャッシュに保存されていない必要があります。デバイスは、既知の URI 検出を定期的に再試行して、キャッシュされたパスがまだ最新であることを確認し、パスが変更された場合は再同期する必要があります。2 ~ 4 週間ごとにレートを設定することをおすすめします。
リソース
CardDAV は REST のコンセプトを使用します。クライアント アプリケーションは、URI で指定されたリソースに対して動作します。ここでは、デベロッパーが次のセクションのコンセプトを理解できるように、現在の URI 構造について説明します。構造は変更される可能性があるため、ハードコードしないでください。代わりに、リソースは RFC に従って検出する必要があります。
- プリンシパル
- https://www.googleapis.com/carddav/v1/principals/
userEmail
- https://www.googleapis.com/carddav/v1/principals/
- ホームセット
- https://www.googleapis.com/carddav/v1/principals/
userEmail
/list
- https://www.googleapis.com/carddav/v1/principals/
- アドレス帳
- https://www.googleapis.com/carddav/v1/principals/
userEmail
/lists/default
- https://www.googleapis.com/carddav/v1/principals/
- お問い合わせ
- https://www.googleapis.com/carddav/v1/principals/
userEmail
/lists/default/contactId
- https://www.googleapis.com/carddav/v1/principals/
連絡先の同期
サポートされているオペレーションの概要は次のとおりです。デベロッパーは、関連する RFC で詳細を調べる必要があります。リクエストとレスポンスのほとんどは XML でエンコードされます。クライアント アプリケーションが同期に使用する主なオペレーションは次のとおりです。
- CTag を使用する
- クライアント プログラムは、アドレス帳リソースの
getctag
PROPFIND
リクエストを使用して、サーバーで連絡先が変更されたかどうか、つまり同期が必要かどうかを確認します。連絡先が変更されると、このプロパティの値が必ず変更されます。クライアント アプリは、この値を保存して、最初の同期時にのみ使用し、sync-token
が無効化されたときのフォールバックとして使用する必要があります。getctag
プロパティを定期的にポーリングすると、スロットリングが行われます。
- クライアント プログラムは、アドレス帳リソースの
- 同期トークンを使用する
- クライアント プログラムは、アドレス帳の
sync-token
PROPFIND
リクエストを使用して、現在の状態を表すsync-token
を取得します。クライアント アプリケーションは、この値を保存して、前回のsync-token
以降の変更を確認するために、定期的にsync-collection
REPORT
リクエストを発行する必要があります。発行されたトークンは 29 日間有効で、REPORT
レスポンスには新しいsync-token
が含まれます。
- クライアント プログラムは、アドレス帳の
- ETag の使用
- クライアント アプリケーションがアドレスブック リソースで
getetag
PROPFIND
リクエストを発行します(DEPTH
ヘッダーはDEPTH_1
になります)。各連絡先のETag
値を保持することで、クライアント プログラムは、ETag
が変更された連絡先の値をリクエストできます。
- クライアント アプリケーションがアドレスブック リソースで
- 連絡先の取得
- クライアント アプリケーションは、
addressbook-multiget
REPORT
リクエストを発行して連絡先を取得します。連絡先 URI のリストを指定すると、リクエストされたすべての連絡先が VCard 3.0 値として返されます。各エントリには、連絡先のETag
が含まれています。
- クライアント アプリケーションは、
- 連絡先の挿入
- クライアント アプリケーションが、VCard 3.0 形式の新しい連絡先を含む
POST
リクエストを発行します。レスポンスには、新しい連絡先の ID が含まれます。
- クライアント アプリケーションが、VCard 3.0 形式の新しい連絡先を含む
- 連絡先の更新
- クライアント アプリケーションが、VCard 3.0 形式の更新された連絡先を使用して
PUT
リクエストを発行します。連絡先がアドレス帳にすでに存在する場合、連絡先が更新されます。 - クライアント アプリケーションには、現在連絡先に登録されている
ETag
を含むIf-Match
ヘッダーを含める必要があります。サーバー上の現在のETag
がクライアント プログラムから送信されたETag
と異なる場合、サーバーはHTTP 412
を使用してPUT
リクエストを拒否します。これにより、更新の楽観的なシリアル化が可能になります。
- クライアント アプリケーションが、VCard 3.0 形式の更新された連絡先を使用して
- 連絡先の削除
- クライアント アプリケーションは、連絡先 URI に対して
DELETE
リクエストを発行して連絡先を削除します。
- クライアント アプリケーションは、連絡先 URI に対して