Objective-C
iPhone
iOS
Crashlytics

開発用ビルドにだけ解析ツールを組み込みたい

More than 3 years have passed since last update.

 Crashlyticsなどのクラッシュ計測ツールを利用するとXcodeに繋いでデバッグしているとき以外でも簡単に、詳細なクラッシュ要因を受け取ることができます。

 ですが、不特定多数のユーザに関する情報を収集することになるので利用規約を準備して、収集内容をユーザに説明した上で収集に同意してもらう必要があります。

 正直なところもの凄く手間な上にチュートリアルの突破率も下がるので、私が開発するアプリではBetaを使ったテスター配布のアプリにだけクラッシュ解析ツールを導入するようにしています。

 今回はその方法について。 Debug/Release版での処理切り分けに使ったり応用性も高いです。


TARGETSを複製する

 Configurationsを複製するだけでもいいんですが、TARGETSから複数用意した方がヒューマンエラーが減るのでいいと思います。

ss1.png

別にiPad版を作るわけではないので、「Duplicate Only」を選択します。

ss2.png

 新しく「元になったTARGET名 copy」というTARGETと、勝手に名前を付けられたplistが増えると思います。

 ちょっとこのままだと微妙な名前なのでリネームします。取り合えず適当にdebugとか。

ss3.png

ss4.png

 TARGETSに戻って、こちらもcopyからdebugに変更。info.plistの名前を変更したので紐付けが外れてしまってますので、「Choose Info.plist File ...」から先ほどリネームしたファイルを紐付けます。

ss5.png

 デバッグ用はBundle Identifierを切り分けて別アプリとしてホーム画面に置きたい場合は、直接Bundle Identifierを書き変えるかProduct Nameを別名にしてしまいます。

 ※Product Nameを変更したらCrashlyticsへはまた再登録してください


Preprocessor Macrosを設定する

ss6.png

 Build Settingsから、もしBasicが選択されていたら「All」を選択してプリプロセッサマクロを設定します。

ss7.png

 取り合えず適当にそれっぽい名前で。これを定義しておくと、ビルドする際にこのTARGETS、このConfigurationsのときにだけこの定義が行われます。

ss8.png

 例えばこんな感じで書くことで、CrashlyticsをインストールしたいビルドにだけPreprocessor Macrosで「VALID_CRASHLYTICS=1」を定義することができます。使わないTARGETSではCrashlyticsのライブラリリンク自体切ってもいいかもしれませんね。

 これでストア申請用のバージョン以外は別のTARGETSからビルドする、というオペレーションにしておけば本番用ビルドには解析ツールを導入することなくクラッシュ解析ツールの導入、またCrashlyticsならばBetaによるテスターへの配布ということが行えるようになります。

 例えば私がいま開発中のアプリでは、アプリ名の後ろにdebug、adhocの名称がついているTARGETSを別に用意していてデバッグ版、本番環境のAdHoc版で切り分けるようにしています。


その他

 Preprocessor Macrosは色々なことに応用できます。

例えばNSLogの出力内容はリリース後のアプリからでも閲覧可能なので、実機をPCにつないでOrganizerとかiPhone構成ユーティリティを開いてアプリ起動して見ると表示されてしまいます。

 そのため、例えば以下のように記述してNSLogは本番環境では動作しないようにさせることができます。

#ifdef  DEBUG

#define NSLog(...); NSLog(__VA_ARGS__);
#else
#define NSLog(...); // NSLog(__VA_ARGS__);
#endif