アプリがUDIDにアクセスしているかを確認する方法
2013年5月1日からUDIDにアクセスするアプリは強制的にリジェクトされるようになりました.
具体的にはUIDeviceクラスの
- (NSString *)uniqueIdentifier
を呼び出すコードが含まれているアプリがリジェクトの対象になります.
このドキュメントでは、
自分のプロジェクトでUDIDアクセスしているコードがないかを確認する
簡易的な方法について説明します.
目次
- 注意
- UDIDアクセスのパターンと検出可否
- 検出方法
- 1. プロジェクト内でメソッドを検索する
- 2. カテゴリー拡張でメソッドを置き換える
注意
ここで説明している方法はあくまでも簡易的な手段であり、確実に検出できることを保証していません.
また検出方法の紹介であり修正あるいは審査をパスするための方法ではありません.
以下の手段で検出された場合には適切な対応を行なって下さい.
UDIDアクセスのパターンと検出可否
Apple側のUDIDチェックの仕組みからUDIDアクセスをしているパターンと検出可否は以下のようになります.
# | 実装ファイルへのアクセス | 実際の呼び出し | 検出可否 |
---|---|---|---|
1 | 実装ファイルへアクセス可能 | 実行中に呼び出される | 検出可能 |
2 | 実装ファイルへアクセス可能 | 実行中に呼び出されない | 検出可能 |
3 | 実装ファイルがない | 実行中に呼び出される | 検出可能 |
4 | 実装ファイルがない | 実行中に呼び出されない | 検出不可 |
実装ファイルへアクセス可能なコードは、例えば自身が書いたコードやオープンソースのライブラリが該当します.
また、実装ファイルがないものは、広告やアクセス解析などのプリコンパイル済み静的ライブラリ(.aファイル)が該当します.
今回紹介する検出方法では、静的ライブラリの中で、
実行中に呼び出されない箇所でUDIDアクセスしている(uniqueIdentifier
を呼び出している)場合には検出ができません.
検出方法
1. プロジェクト内でメソッドを検索する(#1, #2で有効)
Xcodeのプロジェクト内検索(Option+Shift+F)から
uniqueIdentifier
を検索して見つけて下さい.
自身で実装したファイル、あるいはソースが公開されている外部ライブラリなど、
実装ファイル(.m)に直接アクセスできる場合にのみ有効な手段です.
2. カテゴリー拡張でメソッドを置き換える(#3で有効)
Objective-Cの機能であるカテゴリー拡張を利用して、
uniqueIdentifier
メソッドを上書きして検出します.
AppDelegateクラスの実装ファイルに以下のコードを書いて下さい.
// #importなど本来のAppDelegateの実装
@implementation UIDevice(UDIDCheck)
- (NSString *)uniqueIdentifier
{
return @"UDID is accessed!!"; // set breakpoint here
}
@end
// 本来のAppDelegateの実装
上記7行目にブレークポイントを設定した状態で、
Xcodeからアプリを実行して動かして下さい.
実行中に
uniqueIdentifier
にアクセスが発生した場合には上記箇所でアプリが止まります.
この検出手段は、
外部SDKなどコンパイル済みの静的ライブラリを使っている場合でも有効です.
ただし、実行中にアクセスが発生しないと検出できないため、
確実な方法ではありません.