
《必見》Unity任せの機種固有ID取得は危険!-Unityアプリの効果計測
Unityでのアプリ開発もだいぶ普及してきました。 UnityはAndroidやiOSなどスマートフォン向けアプリの開発だけでなく、WindowsやMac、更にはPlayStation3/4/Vita、Xbox360、WiiUなど様々なプラットフォームに対応したゲーム開発統合環境です。
今回はこのUnityのアプリで行う「効果計測」についてです。
Unityと機種固有ID
Unityでスマートフォン向けアプリ開発を行った場合、
- ・Unityのバージョン
- ・スマートフォンOS
などの違いで、Unityが取得するスマートフォンの機種固有IDが異なってしまう現象が確認されています。
当然ですが機種固有IDが一意でないと、アプリの効果計測はできません。 機種固有IDが変わるということはその端末を特定できなくなります。 そうすると、初回インストール時の成果が「課金」、「チュートリアル突破」といったLTV成果(Life Time Value)と紐付ることができず、ユーザー(端末)の行動がまったくわからなくなります。 また、アプリの再インストールで機種固有IDが変わってしまうと「過去にアプリをインストールした端末だな。」といったこともわからなくなってしまいます。
機種固有ID取得メソッド:SystemInfo.deviceUniqueIdentifier
AppStoreやGooglePlayの規約変更により、取得してもよいキーが頻繁に変わります。(特にApple) 最近の変更は以下のような感じです。
Apple(iOS)規約
- 2013年5月:UDID利用禁止(利用アプリのリジェクト)
- 2013年9月:Macアドレス取得禁止(iOS7以降すべての端末で固定値を返す)
- 2014年2月:IDFA取得禁止(広告を利用しないアプリのみ適用。広告アプリならOK)
Android Advertising ID規約(概要)
- 広告とユーザーの分析以外で使用してはいけません。
- ユーザーの明示的な同意なしに、SSAID、MACアドレス、IMEIなどに関連付けたりしてはいけません。
Unityの機種固有ID取得メソッド『SystemInfo.deviceUniqueIdentifier』もAppleやGoogleの規約に準拠して都度適正な値を取得するように更新されています。 以下、Unity公式サイトのリリースノートに記載されている『SystemInfo.deviceUniqueIdentifier』の情報をまとめました。
Unity4.3
[iOS]
- ・Vendor/Ad ID(iOS6)のサポートを追加。
- ・SystemInfo.deviceUniqueIdentifier のロジックを変更
- ・iOS7 では(Ad Tracking が有効な場合)Ad ID が使われ、それ以外の場合は Vendor ID にフォールバックする。
- ・iOS7 未満のバージョンでの動作は変更なし(MAC アドレスのハッシュ)
Unity4.2.1
[iOS]
- ・iOS 7 beta 上で SystemInfo.deviceUniqueIdentifier で得られるudidがUnity4.1と異なる値を取得していた問題を修正
- ・複数回 SystemInfo.deviceUniqueIdentifier を使用した時クラッシュしてしまう問題を修正
Unity4.0
[Android]
- ・SystemInfo.deviceUniqueIdentifier は IMEI / MEID、ANDROID_ID または WiFi MAC ―― いずれかの MD5 合計を計算して匿名化される
- ・SystemInfo.deviceUniqueIdentifier はマニフェストに正しいアクセス権を自動的に追加していなかった
Unity3.5.7
[Android]
- SystemInfo.deviceUniqueIdentifier はマニフェストに正しいアクセス権を自動的に追加していなかった
Unity3.5.5
[iOS]
- ・SystemInfo.deviceUniqueIdentifier が非推奨の UIDevice.uniqueIdentifier を使用しないよう修正
こうやってみると結構変更されていますね。Unity4.2.1では前バージョンと異なる値を取得していたのも問題ですが、禁止されたUDIDを取得していることの方が致命的です。 常にUnityを最新バージョンしておかないとアプリ自体がリジェクトされる可能性があるということを認識しておく必要があります。
Unityバージョン毎の取得した機種固有ID(iOS)
以下、弊社で動作検証を行った際のSystemInfo.deviceUniqueIdentifierで取得した値です。

問題点
*1
「0f607264fc6318a92b9e13c65db7cd3c 」これはMACアドレスをMD5でハッシュ化したものとなります。 iOS7ではMACアドレスはすべて固定値「02:00:00:00:00:00」で取得されるため、端末の特定ができなくなります。また効果計測側で機種固有IDによる重複排他を行っていた場合、iOS7端末の計測は全くできないこととなります。
*2
リリースノート「4.2.1」のとおり「iOS 7 beta上でSystemInfo.deviceUniqueIdentifierで得られるudidがUnity4.1と異なる値を取得していた問題を修正」となります。 今回「4.1.0f」で取得したiOS6の機種固有IDと「4.2.0f4」では値が異なっていますが、「4.2.1」以降である「4.3.4f1」では元の値に戻っています。 開発アプリがUnity4.1.0→Unity4.2.0→Unity4.3.0としていた場合、Unity4.2.0の時の効果測定データが死にデータとなります。(紐付くデータがない。新規データとなる。)
*3
Unity4.2以降でもiOS7の場合、アプリの再インストールで機種固有IDが異なってしまいます。 これはiPhone側でIDFAをブロックしていたために発生しています。この場合、For Vernderを利用するため、同じベンダーのアプリが端末に残っていない場合、機種固有IDが新規作成されてしまいます。 アプリの効果測定を行う場合は『再インストールしても変更されない一意のキー』を利用しなければ正しい計測が行えません。
Unityアプリでの機種固有ID
それでは、Unityアプリではどのように機種固有IDを取得すれば良いのでしょうか?答えは簡単です。SystemInfo.deviceUniqueIdentifierを使わず、独自で取得したいキーを指定して利用すれば問題ありません。
Androidであれば、javaを利用してIMEIやAndroidID、Android Advertising IDを取得、iOSであれば、xcodeを利用してFor Vernder、IDFA、UUIDなどを取得することで、AppleやGoogleの規約が変更になった場合も、Unityの対応を待たずに即時対応可能となります。
アプリの管理がめんどくさくなりそうですが、手間を惜しまないことでアプリのリジェクトを回避する可能性が高まります。また迅速に対応することができます。 SystemInfo.deviceUniqueIdentifierを使う場合は常に各OSのバージョンやUnityのリリース情報をウォッチして、矛盾が発生しないようにしましょう。
今後もアプリ開発にUnityを利用されるベンダー様は多いでしょう。 効果測定用のSDKを提供している我々としても、いろんなプラットフォームに関するアンテナを張り巡らせて、今後も柔軟に対応していこうと思います。