Crashlyticsなどのクラッシュ計測ツールを利用するとXcodeに繋いでデバッグしているとき以外でも簡単に、詳細なクラッシュ要因を受け取ることができます。
ですが、不特定多数のユーザに関する情報を収集することになるので利用規約を準備して、収集内容をユーザに説明した上で収集に同意してもらう必要があります。
正直なところもの凄く手間な上にチュートリアルの突破率も下がるので、私が開発するアプリではBetaを使ったテスター配布のアプリにだけクラッシュ解析ツールを導入するようにしています。
今回はその方法について。 Debug/Release版での処理切り分けに使ったり応用性も高いです。
TARGETSを複製する
Configurationsを複製するだけでもいいんですが、TARGETSから複数用意した方がヒューマンエラーが減るのでいいと思います。
別にiPad版を作るわけではないので、「Duplicate Only」を選択します。
新しく「元になったTARGET名 copy」というTARGETと、勝手に名前を付けられたplistが増えると思います。
ちょっとこのままだと微妙な名前なのでリネームします。取り合えず適当にdebugとか。
TARGETSに戻って、こちらもcopyからdebugに変更。info.plistの名前を変更したので紐付けが外れてしまってますので、「Choose Info.plist File ...」から先ほどリネームしたファイルを紐付けます。
デバッグ用はBundle Identifierを切り分けて別アプリとしてホーム画面に置きたい場合は、直接Bundle Identifierを書き変えるかProduct Nameを別名にしてしまいます。
※Product Nameを変更したらCrashlyticsへはまた再登録してください
Preprocessor Macrosを設定する
Build Settingsから、もしBasicが選択されていたら「All」を選択してプリプロセッサマクロを設定します。
取り合えず適当にそれっぽい名前で。これを定義しておくと、ビルドする際にこのTARGETS、このConfigurationsのときにだけこの定義が行われます。
例えばこんな感じで書くことで、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