スマホのアプリを開発する上で端末を識別するのに何が使用できるのか調べたのでまとめておきます。
各識別子
Android/iOS共通
・MACアドレス
ネットワーク機器に一意に割り当てられるアドレス。
通常変更はできないが、脱獄などしている場合はできる模様。
ネットワークアダプタが搭載されてない場合や無効になっている場合は取得できない。
・IMEI(International Mobile Equioment Identity、国際移動体装置識別番号)
携帯電話など通信端末に付与される番号。15桁の数字。
通常変更はできるものではないが、もし変更すると違法となる。
端末を一意に識別できる。
・MEID(Mobile Equipment Identifier)
IMEIと同じで携帯電話に付与される番号。15桁の数字。
フォーマットもIMEIと同じだがコチラは16進数になっている。
・ICCID(IC Card Identifier)
ICカードごとに固有の番号。最大19桁の数字。
スマートフォンではSIMカードに付与されている。
・IMSI(International Mobile Subscriber Identity)
携帯電話加入者に対して発行される識別番号。通常は15桁の数字。
携帯電話に直接あるいはSIMカードに記録されている
・シリアル番号
端末のシリアル番号
携帯電話ではない端末は一意な番号を取得できる
携帯電話によっては取得できるものもある
Androidのみ
・Android_ID
端末の初期化時にランダム生成される文字列。16進数の16桁の数字
初期化以外では変更されない。
・AdvertisingID
広告での使用を目的とした永続ID。
広告目的でしか使用できない。
ユーザの設定により取得できないようにしたり、リセットして新しいIDに変更したりできる。
iOSのみ
・UDID(Unique Device Identifier)
端末ごとに一意の識別子
ただし、iOS5で非推奨、iOS6でリジェクト対象、iOS7で無効な値を返すようになっている
・IDFV(Identifier For Vender)
UDIDの替わりの端末識別子
IDFAと違い広告目的に限定されていない
ベンダー毎に一意のUUIDが取得できる、端末に入れた同じベンダーのアプリすべてから同じUUIDが返ってくる
端末からそのベンダーのアプリがすべてアンインストールされるとリセットされるらしい
・IDFA(Identification For Advertisers)
広告での使用を目的とした永続ID
ユーザが設定からリセットできる、端末初期化でもリセットされる
広告目的以外での使用はリジェクト対象になる
使用可能か&使用方法
Android
・Macアドレス
・使用不可
・以前はAPIから取得できたが、Android6.0からは該当のAPIは常に02:00:00:00:00:00を返すように変更された。
・IMEI
・可能
・パーミッション必要:READ_PHONE_STATE
・TelephonyManager getDeviceId
・MEID
・可能
・方法はIMEIと同じ
・ICCID
・可能
・パーミッション必要 READ_PHONE_STATE
・TelephonyManager getSimSerialNumber
・IMSI
・可能
・パーミッション必要 READ_PHONE_STATE
・TelephonyManager getSubscriberId
・シリアル番号
・可能(携帯電話以外)
・パーミッション不要
・android.os.Build.SERIAL
・Android_ID
・可能
・パーミッション不要
・Settings.Secure.getString(this.getContentResolver(), Settings.System.ANDROID_ID)
・AdvertisingID
・可能
・パーミッション不要
・AdvertisingIdClient.getAdvertisingIdInfo(mContext).getId();
iOS
・Macアドレス
・不可能
・非公式な方法はあるが、取得できたとしてiOS8からMacアドレスがランダム生成されているらしいので端末の識別には使用できない
・IMEI
・不可能
・iOS3までは取得できたようだが現在は無理
・MEID
・不可能
・ICCID
・不可能
・IMSI
・不可能
・シリアル番号
・不可能
・UDID
・不可能
・実はAPIは残っているが、無効な値しか返ってこない、そもそも使用しているだけでリジェクト対象になる
・IDFV
・可能
・UIDevice identifierForVender
・IDFA
・可能
・広告目的限定、それ以外に使用するとリジェクト対象
・ASIdentifierManager AdvertisingIdentifier