iOSアプリでクラッシュしたときにログを送信するサービスはいくつかありますが、自分はCrittercismをよく使います。ドキュメントを読んでその通りに実装すればすぐ動くので使いやすいです。
さらに手間も省く事ができるので、その辺りをメモしておきます。
SDKのインストール
zipファイルをダウンロードして入れる事も出来ますが、CocoaPodsでインストールする事も出来ます。
$ pod search crittercism
-> CrittercismSDK (4.3.1)
Mobile App Performance Monitoring and Crash Reporting.
pod 'CrittercismSDK', '~> 4.3.1'
- Homepage: http://www.crittercism.com
- Source: https://app.crittercism.com/images/Crittercism_v4_3_1.zip
- Versions: 4.3.1, 4.3.0, 4.1.2, 4.1.1, 4.1.0, 4.0.7, 4.0.6, 4.0.5, 4.0.4, 4.0.3, 4.0.2, 4.0.1, 4.0.0, 3.5.3, 3.5.1,
3.4.9, 3.4.8, 3.4.0, 3.3.4, 3.3.1 [master repo]
リリースビルドの時だけCrittercismを動かす
デバッグ中のクラッシュはCrittercismが拾っても意味が無いので、リリースビルドの時のみ動くようにします。
# ifndef DEBUG
[Crittercism enableWithAppID: @"〜〜"];
# endif
dSYMファイルの自動アップロード
ドキュメントにも書いてありますが、CrittercismSDKにはdSYMファイルのアップロードスクリプトが含まれています。これをBuild Phasesの"Run Script"に追加しておくと、dSYMファイルが自動でアップロードされます。
ただし実装中やデバッグ中は何度もビルドし直します。その都度dSYMファイルがアップロードされるのも気になりますし、ネットワーク的にアップロードに時間がかかったりする時もあります。なので、リリースビルド時のみファイルをアップロードするように、RunScriptを書きます。
if [ "${CONFIGURATION}" = "Release" ]; then
APP_ID="〜〜"
API_KEY="〜〜"
source ${SRCROOT}/Pods/CrittercismSDK/CrittercismSDK/dsym_upload.sh
fi
↑は、CocoaPodsでCrittercismSDKをインストールしているので、Pods/ディレクトリの中のdsym_upload.sh ファイルを指定しています。
dsym_upload.shにタイムアウト設定を追加
dSYMファイルのアップロードが遅い時があります(APIのトラブルやネットワーク的に遅い時等)。失敗するのは良いとしても無反応になってXCodeそのものが固まり中断も出来なくなる場合があります。なので、早めにタイムアウトするように、dsym_upload.shを修正します。
STATUS=$(curl "${URL}" --write-out %{http_code} --silent --output /dev/null -F dsym=@"${DSYM_ZIP_FPATH}" -F key="${API_KEY}" -m 30) #-m 30 を追加
CFBundleVersionの自動更新
アプリをiTunesConnectにアップロードする際には、CFBundleShortVersionStringを修正する事が多いと思います。
しかしCrittercismは、CFBundleVersion毎にクラッシュを集計します。
両方を更新するような運用ルールにするのも良いのですが、CFBundleVersionを自動で設定するようにRunScriptを追加しておきます。このRunScriptは、Compileの前に実行する順番にします。
if [ "${CONFIGURATION}" = "Release" ]; then
versionStr=`/usr/libexec/PlistBuddy -c "Print :CFBundleShortVersionString" ${SRCROOT}/(Info.plistのパス)`
echo $versionStr
dateStr=`date "+%Y%m%d"`
echo $dateStr
bundleVersion=$versionStr.$dateStr
echo $bundleVersion
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $bundleVersion" ${SRCROOT}/(Info.plistのパス)
fi
このRunScriptで、CFBundleVersionがCFBundleShortVersionString+(日付) となります。
このRunScriptの欠点は、ビルドした後でInfo.plistが書き変わる事があるので、ビルド後にgitの差分が出る事です。自分はあまり気にせずやっています。