職人が教える!iOSアプリ開発で使いこなしたいとっておきのOSS

第2回 アプリ内でログを閲覧するためのライブラリ iConsole

この記事を読むのに必要な時間:およそ 2 分

実機で開発中のアプリの動作確認を行う際,Xcodeと接続していないときにもNSLogやprintf等で出力したログを確認したい場合があるかと思います。

iConsoleはアプリ内でログ閲覧するためのライブラリで,

画像

このようにコンソールライクなウィンドウをアプリ内に表示してログを確認できるようになります。

iConsoleの特徴

アプリ内でログ閲覧できるようにすること自体は

  • 出力したい文字列(=ログ)をプールする
  • ログを確認するための画面を表示する

という2つの機能が最低限あればよいので,実際のところ自作しても大変ではないのですが,iConsoleは上記機能をラップしている以外に,多くの特徴を備えています。

たとえば,

  • 5段階のログレベルを指定することで,ログ出力量を段階的にコントロールできる
  • クラッシュ時に自動的にスタックトレースをロギングしてくれる
  • コンソール画面の起動方法として,スワイプでの起動,シェイクでの起動といった機能を備えているので,アプリ本体のUIに変更が不要
  • Emailでのログ送信

などなど。詳しい使い方は後述します。

また,リリースビルド用に,プリプロセッサマクロへの指定だけで処理をスキップするように実装されていたり,ログでメモリを食い過ぎないように最大数も定数で指定できたりと,しっかり作られている感があります。

使い方:基礎編

ここでは,シンプルにログ出力する方法を紹介します。

  1. ソースコードを以下のURLよりダウンロード

  2. iConsoleフォルダとGTMフォルダをプロジェクトに追加

  3. メインウィンドウのクラスをiConsoleWindowに変更

    MainWindow.xib がある場合は,Interface Builderからxibの中にあるメインウィンドウのオブジェクトのクラスにiConsoleWindowを指定します。

    MainWindow.xibがない場合は,AppDelegateでiConsoleWindow.hをインポートし,UIWindowをiConsoleWindowに置き換えてください(iConsoleWindow は UIWindow のサブクラスです)⁠

  4. ログを出力する

    ログを出力したいクラスで iConsole.h をインポートし,

    • #import "iConsole.h"

    ログを出力したい箇所で,log: メソッドをコールします。

    [iConsole log:@"some message"];
    

以上です。

デフォルトの状態では,スクリーンを下から上に3本指スワイプすることでコンソール画面を表示できます。

使い方:応用編

iConsole.h の定数を変更することでより便利に利用することができます。

いくつか重要なものをピックアップします。

#define CONSOLE_ENABLED 1

この定数をコメントアウトし,Xcodeのビルド設定から,Preprocessor Macrosにdebugモードは"CONSOLE_ENABLED=1",releaseモードは"CONSOLE_ENABLED=0"を指定してください。

画像

これにより,リリースビルドでiConsoleWindowがオーバーライドしている個所はすべて無視され,iConsoleのシングルトンオブジェクト生成処理(sharedConsole)やログ出力処理(log:arguments:)はスキップされるようになります。

#define LOG_LEVEL LOG_LEVEL_INFO

出力するログのレベルを指定します。

ログレベルは

#define LOG_LEVEL_NONE 0
#define LOG_LEVEL_CRASH 1
#define LOG_LEVEL_ERROR 2
#define LOG_LEVEL_WARNING 3
#define LOG_LEVEL_INFO 4

と5段階で定義されており,またそれぞれのレベルでログを出力するメソッドとして

+ (void)log:(NSString *)format, ...;
+ (void)crash:(NSString *)format, ...;
+ (void)error:(NSString *)format, ...;
+ (void)warn:(NSString *)format, ...;
+ (void)info:(NSString *)format, ...;

の5つが用意されています。

LOG_LEVEL定数に指定したレベル値より低いログのみが出力されるようになるので,たとえば,LOG_LEVELにLOG_LEVEL_CRASHを指定すると,log:, crash:を使用したログのみが出力されます。

また,LOG_LEVEL_NONEを指定するとすべてのログが出力されなくなります。つまり,log:メソッドはLOG_LEVEL_NONEのログを出力するというわけではなく,LOG_LEVEL_NONE以外すべてのログレベルで有効なログを出力するもの,という点にご注意ください。

#define ADD_CRASH_HANDLER 1

この定数をオンにすることで,クラッシュ時に自動的にスタックトレースをログ出力してくれます。

#define SAVE_LOG_TO_DISK 1

この定数をオンにすることで,ログをNSUserDefaultsに保存してくれます。キーは"iConsoleLog"です。

#define MAX_LOG_ITEMS 1000

ログの最大数を指定します。ログはNSMutableArray型のlogプロパティに貯められていくので,メモリを食い過ぎないよう注意が必要です。ちなみにログ出力メソッド(log: など)1回分が1ログという数え方になっています。

#define LOG_SUBMIT_EMAIL @"xxx@xxx.com"

ログを Email 送信する際のデフォルト送信先を設定します。

まとめ

アプリ内でログ閲覧できるようになるライブラリ,iConsoleを紹介しました。ログを出力する,ログを閲覧するといった基本的な使い方以外にも,デバッグに役立つさまざまな便利機能を備えているので,ぜひお試しください。

著者プロフィール

堤修一(つつみしゅういち)

1978年生まれ。京都大学工学部を卒業後,同大学院修了。その後,NTTデータにて音声認識技術の研究開発,キヤノンにて画像処理機能の設計に携わる。

2010年より面白法人カヤックに入社。3年間ほぼiOSアプリ開発に専念し,フルスクラッチで開発しリリースしたアプリは30本以上。代表作は150万ユーザを突破した「バウンドモンスターズ」,AppStore Best of 2012を獲得した「タップ忍者」,カンヌ国際広告祭でブロンズを獲得した「Domino's App」など。

現在は,米国シリコンバレーのマウンテンビューにあるAppSocially社の一員として活躍中。

著書=『iOSアプリ開発 達人のレシピ100―開発現場で実証された実用コード集』

ブログ=Over&Outその後

Github=shu223

Twitter=shu223

コメント

コメントの記入