ちょっと話題の記事

[iOS 11] 初回起動判定などに使える DeviceCheck フレームワークとは #WWDC17

2017.06.09

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

iOS 11 から DeviceCheck が追加

iOS 11 から DeviceCheck というフレームワークが追加されることが発表されました。その名の通りデバイスをチェックするフレームワークで、デバイス〜開発者間のデータをサーバーサイドのビジネスロジックで利用できるといった機能を提供します。具体的にどういった機能なのか調べてみました。

本記事は Apple からベータ版として公開されているドキュメントを情報源としています。 そのため、正式版と異なる情報になる可能性があります。ご留意の上、お読みください。

DeviceCheck でできること

簡単にまとめると、デバイスごとにトークンを生成し、そのトークンを使ってデバイスごとのフラグ(2つまで)を保持することができます。例えば「アプリの初回起動時のみプレゼント」を実現するための初回起動判定用フラグなどに活用できます。

  • デバイス用の API (フレームワーク) とサーバーサイド用の API を提供
  • デバイスを識別するトークンを生成できる
  • デバイスごとに2ビットのデータを設定および照会できる
  • ユーザーのプライバシーは維持される (個人情報につながるデータは提供されない)
  • データを更新すると、最後に更新された日時が返される
  • これらのデータを使って、サーバーサイドのビジネスロジックで何らかの判定処理を行える

2つのブール値を記録できるので、計4通りの状態を表現できることになります。

iOS アプリ側の実装

DeviceCheck フレームワークに含まれる DCDevice クラスを使って、トークンを生成することができます。これをサーバーサイドに何らかの方法で投げれば良いです。プッシュ通知のデバイストークンの連携方法と同じようなイメージで良いと思います。

DCDevice.current.generateToken { dataOrNil, errorOrNil in
  guard let data = dataOrNil else { return }
  // data (トークン) をサーバーサイドに渡す処理を書く
}

サーバーサイド側の実装

サーバーサイド側では、プッシュ通知を送る API リクエスト (APNs) と同じ方式で認証し、設定・照会の API を呼び出します。具体的には下記のドキュメントに記載されています。

ドキュメントには API の仕様が書かれています。ざっくり見ていきましょう。

照会

curl から呼ぶ場合は次のようになります。

curl -i --verbose -H "Authorization: Bearer <GeneratedJWT>" \
-X POST --data-binary @ValidQueryRequest.json \ 
https://api.development.devicecheck.apple.com/v1/query_two_bits

POST パラメータは次の表の通りです。

パラメータ データ型 説明 必須
device_token String アプリから送信されたデバイストークン Yes
transaction_id String サーバーで生成した一意のID Yes
timestamp Long サーバーで生成した UTC タイムスタンプ Yes

リクエストに成功すると、2つのブール値と最終更新日時が取得できます。

{
   "device_token" : "wlkCDA2Hy/CfrMqVAShs1BAR/0sAiuRIUm5jQg0a..."
   "transaction_id" : "5b737ca6-a4c7-488e-b928-8452960c4be9",
   "timestamp" : 1487716472000 
}

更新

curl から呼ぶ場合は次のようになります。

curl -i --verbose -H "Authorization: Bearer <GeneratedJWT>" \
-X POST --data-binary @ValidUpdateRequest.json \
https://api.development.devicecheck.apple.com/v1/update_two_bits

POST パラメータは次の表の通りです。

パラメータ データ型 説明 必須
device_token String アプリから送信されたデバイストークン Yes
transaction_id String サーバーで生成した一意のID Yes
timestamp Long サーバーで生成した UTC タイムスタンプ Yes
bit0 Boolean 新しいブール値① No
bit1 Boolean 新しいブール値② No

リクエストに成功すると、更新後のデータが取得できます。

{
   "device_token" : "wlkCDA2Hy/CfrMqVAShs1BAR/0sAiuRIUm5jQg0a..."
   "transaction_id" : "5b737ca6-a4c7-488e-b928-8452960c4be9",
   "timestamp" : 1487716472000,
   "bit0" : true,
   "bit1" : false 
}

まとめ

アプリの不正利用防止策はいままで独自でやることが多かったですが、DeviceCheck を使うことでより簡単に実装できます。iOS 11 からの機能になるため、それ以前のバージョンのサポートは必須になりますが、いずれこちらの方法が主流になると予想できます。これから iOS 11 向けにアプリを開発するときには、採用を検討するようにしましょう。

参考