強火で進め

このブログではプログラム関連の記事を中心に書いてます。

iOS 7時代のUDID(UUID)取得方法

iOS 6の頃に「そろそろ提供辞めるので対策しててよ」って言われてたUDIDなどがiOS 7からは遂に使用できなく(そのまま使用すると問題が出る値を返す)様に成りました。

色々と変わっているので情報まとめておきます。

uniqueIdentifier

以下の様な記述で取得されていたいわゆるUDIDを取得する為のメソッドです。

[[UIDevice UIDevicecurrentDevice] uniqueIdentifier]

このメソッドはiOS 6の頃から非推奨に成っていました。現在は審査が通らなく成りました。iOS 7では取得する度に異なる値が返される様に成ったみたいです。また、先頭部分は常にFFFFFFFFになるみたいです。 Twitterで「リリースノートに FFFFFFFF + identifierForVendor が返されると書かれている」と教えて貰いました。

iOS 7 Release Notes:
https://developer.apple.com/library/ios/releasenotes/General/RN-iOSSDK-7.0/

なお、この挙動変更によりUDIDを確認するiOSアプリなどはiOS 7で実行した場合には正しい値を返しません。

デバッグをする人の端末のUDIDを確認して貰う時に今まではアプリで簡単に確認出来ましたがこれからは iTunes か Organizer にて確認して貰う必要が有ります。

新しい広告トラッキング向けのメソッド

広告トラッキングの場合は advertisingIdentifier (※iOS 6から実装されているメソッドです)を使用します。
AdSupport.frameworkを追加し、 #import を先頭に記述した状態で以下の記述にて取得出来ます。

    NSUUID *adUUID = [ASIdentifierManager sharedManager].advertisingIdentifier;
    _textField.text = adUUID.UUIDString;

別途 advertisingTrackingEnabled にてユーザが広告トラッキングを許可しているかチェックしてこのUUIDを使用するかどうかを切り分けの必要が有ります。

iOS 6の頃はこのメソッドで取得出来る値は変動する事は無かったですがiOS 6.1からはこの値をリセットするボタンが追加されており、このボタンが押された場合にはUUIDは新しいものに変わります。

iOS6.1の新機能「Advertising Identifierをリセット」を見てみる - mikanmarusanのブログ
http://mikanmarusan.hatenablog.com/entry/20130211/1360581304

この記事で解説されている6.1では「設定 > 一般 > 情報 > アドバタイズ」ですがiOS 7の場合にはこのボタンは「設定 > プライバシー > 広告」に移動されています。

広告トラッキング以外の用途に使用するUUID取得用メソッド

広告トラッキング以外の用途向けには identifierForVendor (※iOS 6から実装されているメソッドです)を使います。以下の様な記述で使います。

    NSUUID *vendorUUID = [UIDevice currentDevice].identifierForVendor;
    _textField.text = vendorUUID.UUIDString;

このメソッドでは「同一ベンダー(アプリ開発者)&同一デバイス」の時には同一のUUIDを返します。1つのデバイスにインストールされている同一ベンダーのアプリの場合にはいずれのアプリでも同一のUUIDが返されます。

しかし、このUUIDは同一ベンダーのアプリが端末から全て削除されるとリセットされ、新しい値に変わりますので気を付けて下さい。

同一ベンダーの判定には .plist の Bundle identifier が使用されるみたいです。

例えば com.example.hoge と設定したアプリと com.example.hoge2 と設定したアプリは同一のUUIDを返します。

com.example.hoge や jp.example.hoge などリバースドメインのドメイン名に当たる部分を変更した場合にはそれぞれ別のUUIDとなる様です。

iOS 6リリース当初には advertisingIdentifier と identifierForVendor にバグ有り

iOS 6.0リリース当初にOTAを使ってOSをアップデートした人には advertisingIdentifier と identifierForVendor の動作にバグが有りました。今となってはこの状態に成っているiOSデバイスに遭遇するのは稀でしょうが念の為に 00000000-0000-0000-0000-000000000000 が返された場合は取得失敗とする処理を実装しておくのが良いでしょう。

A-Liaison BLOG: iOS 6.0の advertisingIdentifier と identifierForVendor にはバグがあるので注意
http://akisute.com/2012/11/ios-60-advertisingidentifier.html

MACアドレスが取得出来なく成った

iOS 7ではMACアドレスが取得出来なく成りました。実際に取得した場合にどのデバイスでも 02:00:00:00:00:00 が返されます。こちらの対策としては identifierForVendor で取得するUUIDなどに置き換えるという方法に成ります。

また、自分のプログラムでMACアドレスの取得部分を削除したとしてもサードパーティのライブラリの中で使用されている可能性も有り得ます。こちらの記事で紹介している方法でチェックすると良いでしょう。

iOS で MAC アドレスを取得するコードをつかまえる - Qiita [キータ]
http://qiita.com/mootoh/items/f97a2224c0c5820c40e3

因みに 02:00:00:00:00:00 というアドレスに成っているのは locally administered ビットを立てて(先頭の0x02)、ローカルで管理するアドレスという設定にして有る為です。適当なグローバスアドレスにしちゃうと他の企業に迷惑がかかっちゃいますからね。

MACアドレス - Wikipedia
http://ja.wikipedia.org/wiki/MAC%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9

gethostuuid()

gethostuuid() はiOS 7で削除されました。既に使用していたアプリをiOS 7で実行した場合は identifierForVendor の値が返されます。

関連情報

[memo]UDID/UUID/UIIDなどとiOS6の新IDの違い - tanamonの日記
http://d.hatena.ne.jp/tanamon/20120924/1348491831

IDFA=Identification For Advertisers。Advertising Identifier(広告識別子)の話。

海外リワード会社におけるIDFAの利用状況と、そもそもIDFAってなんだろう?:That's the Way to GO!:ITmedia オルタナティブ・ブログ
http://blogs.itmedia.co.jp/jinmsk/2013/10/idfaidfa-7baf.html