この記事は公開されてから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 を呼び出します。具体的には下記のドキュメントに記載されています。
- Accessing and Modifying the Per-Device Data | Apple Developer Documentation
- Local and Remote Notification Programming Guide: Communicating with APNs
ドキュメントには 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 向けにアプリを開発するときには、採用を検討するようにしましょう。