しばやん雑記

ASP.NET とメイドさんが大好きなフリーランスのプログラマーのブログ

Xamarin.iOS でも Application Insights を使ってみる

最近は @normalian が Application Insights SDK for Java を弄っていたので、何となく iOS で Application Insights SDK を使ってみようと思いました。

ちゃんと Microsoft から iOS 向けの SDK が公開されています。

Microsoft/ApplicationInsights-iOS · GitHub

f:id:shiba-yan:20150603211415p:plain

残念なことに、まだ Xamarin で使えるバインディングが無さそうだったので、自作して試してみました。

追記

Microsoft から Xamarin 向けの Application Insights SDK がリリースされました。

この記事の後半は独自にライブラリへのバインディングを作る際の参考にしてください。

バインディングを作成

Xamarin Studio で iOS 向けのバインディングプロジェクトを作成し、Objective Sharpie で定義をある程度自動生成するという流れです。つまり、伊勢さんの記事と同じことをやります。

いつからなのかは分かりませんが、Objective Sharpie 自体が GUI では無くなったみたいなので、頑張ってコマンドを叩いて定義を作成していきます。

Objective Sharpie - Xamarin

幸いなことに、Application Insights SDK for iOS は Framework として提供されているので、ダウンロードした Framework に対して 1 回コマンドを叩くだけです。

sharpie bind -framework ApplicationInsights.framework -sdk iphoneos8.3

sdk のパラメータはインストール済みの SDK に合わせて指定します。これで自動生成されました。

f:id:shiba-yan:20150603212138p:plain

ApiDefinition.cs と StructsAndEnums.cs が同じディレクトリに作成されているので、この中身をバインディングプロジェクトにコピーします。名前空間が付いていないので、ファイルコピーだと面倒です。

f:id:shiba-yan:20150603212742p:plain

他には Framework からスタティックライブラリをコピーする必要がありますが、とりあえず省略してビルドを通すように頑張っていきます。

とても面倒なことに、Application Insights SDK for iOS はショートカット用にインスタンスメソッドとスタティックメソッドが、同じ名前でたくさん定義されてます。

f:id:shiba-yan:20150603213218p:plain

このあたりの調整は面倒くさそうだったので、ひとまずはスタティックなメソッドがあるものはそれを優先して、インスタンスメソッドはコメントアウトしておくことにします。

作成したバインディングプロジェクトを GitHub で公開したので、適当にビルドしてください。

ビルドが無事に成功すると dll が生成されます。何と無く Release ビルドにしておきました。

f:id:shiba-yan:20150603215131p:plain

この dll を Xamarin.iOS アプリケーション側の参照に追加することで、やっと Application Insights が使えるようになります。次は実際にアプリケーションに組み込んでみます。

アプリケーションに組み込む

適当に Xamarin.iOS アプリケーションを作成しておき、参照の編集ダイアログからついさっきビルドした ApplicationInsights.dll を参照に追加しておきます。

f:id:shiba-yan:20150603215503p:plain

これで SDK が使えるようになったので、AppDelegate.cs に Application Insights の初期化コードを追加します。

public override bool FinishedLaunching(UIApplication application, NSDictionary launchOptions)
{
    MSAIApplicationInsights.SetupWithInstrumentationKey("...");
    MSAIApplicationInsights.Start();

    return true;
}

InstrumentationKey は Application Insights を作成すると取得できます。疲れてきたので Application Insights を作る部分は紹介しません。

起動したかどうかだけというのも面白くないので、もう少し AppDelegate.cs にコードを追加します。よく使いそうなトレースメッセージを吐き出すコードを仕込んでみます。

public override void DidEnterBackground(UIApplication application)
{
    MSAITelemetryManager.TrackTraceWithMessage("Enter Background");
}

public override void WillEnterForeground(UIApplication application)
{
    MSAITelemetryManager.TrackTraceWithMessage("WillEnterForeground");
}

これで準備ができたので、実際にアプリケーションをシミュレーターで動かして、本当にプレビューポータルの Application Insights から見れるのか確かめてみます。

プレビューポータルから確認

Azure のプレビューポータルから該当する Application Insights を選んで表示してみました。ちゃんとユーザーとセッション数、そしてクラッシュログも取れていることが確認できますね。

f:id:shiba-yan:20150603221346p:plain

ブレードの下の方にある Diagnostic search を開くと、アプリケーションから送信されてきた情報を一覧で表示したり、絞り込んで確認することができます。

f:id:shiba-yan:20150603220942p:plain

仕込んでおいたメッセージが送信されていることも確認できました。絞り込みが結構便利そうです。

クラッシュログも取得できていましたが、dSYM のアップロードに対応していないみたいなので、スタックトレースやメッセージに関しては不完全な状態ですね。

f:id:shiba-yan:20150603221916p:plain

まだ beta3 ですし今後に期待しておきたいと思います。それよりも PCL 化してくれたら、わざわざバインディングを作る必要もないのに。と少し思いました。*1

*1:エラーハンドリング周りは PCL では難しいとは思いつつも要望したい