Tag Archives: Debug

iOSアプリでPrivate APIが使用されてないかチェックしたり、ビルドしたものをいろいろと調べるツールの紹介です。

基本的には、iOSアプリのバイナリの中身を見たりするアプリなので、
まずはバイナリを手元においておく必要があります。

開発してるアプリのプロジェクトをXCodeで開いてArchiveから、OrganizerでShareからipaファイルを出力します。

NewImage

ipaファイルはzipファイルなので、拡張子をzipにするなどして解凍すると、中にアプリ名.appのフォルダがあるので、
その中に、アプリ名(拡張子なし)のファイルがバイナリファイルです

sample というアプリなら、sample.ipaを解凍してsampleディレクトリができるので、
sample/Payload/sample.app/sample が対象のバイナリファイルとなっています。

ツール紹介

バイナリの内容を表示できるコマンドラインツール(元々入ってる)で、リンクしているライブラリ一覧やディスアセンブルしたデータを表示する事ができます。
otoolでバイナリの内容をいろいろと調べる方法 – Over&Out その後

  • nm

こちらも元から入ってるコマンドラインツールで、リンクしているシンボルテーブルの一覧を表示できます。

  • strings

これも同様で、オブジェクトやバイナリに含まれているObjective-Cのセレクタを一覧表示できます。

例えば、テスティングライブラリのgh-unitはapp storeに申請するリリースビルドに含めてしまうと、
_terminateWithStatus というPrivate APIを利用しているという事になってしまいリジェクトされます。

実際にGHUnitIOS.frameworkのGHUnitIOS.framework/Versions/Current/GHUnitIOS(バイナリ) に対してstringsコマンドで
_terminateWithStatus:メソッドが使われている事が確認できます。

➜  Current  strings GHUnitIOS | grep "_terminateWithStatus"
_terminateWithStatus:

このように、Private APIを利用していないかのチェックにも使えます。
(アプリの場合は後述するApp Scannerでもよさそう)

otoolが表示するような内容をGUIから利用できるMachOViewというソフトウェアも存在します。 
これらのツールについては下記が参考になります。

 

App ScannerはiOSアプリを対象にPrivate APIが使用されていないかをチェックできるソフトウェアです。
Stringsコマンドのように、Objective-Cセレクタの検索をGUIから出来たりするので便利です。

ただし、Private APIのチェックは完全ではないのとlinkしてるフレームワークの中身までちゃんとチェックされてるのか、
よくわからない部分もあるため、あまり過信しすぎないようにしましょう。

Private APIでリジェクトされた場合も“Layout”キーワードによってiOS版アプリがRejectされる件につきまして « Appcelerator Developer Centerアプリの審査でリジェクトされてイラッときたこと | HMDT Blogなどのような場合もあるので、Private APIの定義が難しいですが、このようなツールは便利です。