読者です 読者をやめる 読者になる 読者になる

しばやん雑記

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

Application Insights for Mac を使って iOS アプリケーションに SDK を組み込む

Azure Application Insights iOS

Application Insights を ASP.NET と Xamarin.iOS で使ってきましたが、今回はネイティブな iOS アプリケーションに Application Insights を組み込んでみます。

SDK は GitHub で公開されていますが、わざわざダウンロードしなくても Application Insights for Mac を使うと Xcode と連携し、簡単に組み込みが可能です。

Application Insights for Mac

上のリンクからダウンロードしたアプリケーションを実行すると、Microsoft アカウントでのログインが必要になります。Azure のサブスクリプションも当然ながら必要です。

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

ログインすると 2 つのボタンが表示されますが、まずはアプリケーションに SDK を組み込みたいので Integrate を選びます。Upload は dSYM を App Insights にアップデートする場合に使います。

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

Integrate を選ぶと、ローカルマシンに存在する Xcode プロジェクトの一覧が表示されます。

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

さらに Integrate ボタンを選ぶと、パスの確認画面などになりますが、ポチポチと Next ボタンを押していくと Xcode にスクリプトを組み込む画面になります。これはビルド時に dSYM をアップロードする処理です。

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

Run Script を追加してビルドを行うと、自動的に次の画面に切り替わります。次は SDK を Xcode にドラッグドロップでコピーする画面ですが、これも単純にドロップすれば問題ないです。

SDK のコピー後は、Azure 上の Application Insights と関連付ける処理になります。まだ作成されていない場合には、この画面から新しく作成できます。

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

そして最後の手順として、UIApplicationDelegate を実装したクラスに Application Insights の初期化処理を追加します。Objective-C ではなく、Swift も選ぶことが出来ます。

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

組み込んだ結果は以下のようなコードになります。とてもシンプルですね。

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

Application Insights の実行に必要なキーは、組み込み時に Info.plist に自動的に追加されるので、そのまま実行するだけでデータの収集が開始されます。

しばらくするとポータルで情報を確認できるようになります。

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

NSAssert などを使ってエラーを起こすと、クラッシュが収集されていることが確認できます。まだベータ版ですが、OS X 向けのアプリケーションも用意されていて、使い勝手は良くなっています。

Linker でエラーになる場合

Application Insights をセットアップ後、ビルドをすると Linker でエラーが大量に出る場合があります。主に古い Xcode で作成したアプリケーションの場合に発生するようです。

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

エラーの内容が分かりにくいですが、Xcode のビルド設定にある "Enable Modules (C and Objective-C)" が No になっていると発生するようです。なので、これを Yes にするとビルドが通るようになります。

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

アプリ内で @import を使っていなくても、Application Insights が内部で使っているためエラーとなっているようです。基本的に Yes のままにしておけば問題ないと思います。