Swift 2.0 で CocoaPods の CocoaLumberjack を組み込んで使ってみる


動機

iPhone 6Sが発売されて、XCode7が出て、Swift 2になったということで、GPSで位置情報を取得するアプリを書いてみようと思った。バックグラウンドで更新されないので、何故だろうと思って、実機上で、ログファイルを作る必要性がでてきた。

CocoaLumberjack

iOSで、ログファイルを管理するためのライブラリとして、CocoaLumberjackがどうやら結構利用されているので、検索してみると、『 SwiftでもCocoaLumberjack 』と言う記事を見つけて、できるんじゃないか?とやってみた。

CocoaPodsのインストール

console
$ sudo gem install cocoapods
$ pod setup

PodFileの作成

取り込みたいXCodeのプロジェクトの配下に『PodFile』を置く

PodFile
pod 'CocoaLumberjack/Swift',  
:git => ‘https://github.com/CocoaLumberjack/CocoaLumberjack.git', 
:branch => 'swift_2.0' 
use_frameworks!

紹介記事には書いていないけど、『use_frameworks!』を追加しないといけません。

ライブラリのインストール

取り込みたいXCodeのプロジェクトの配下で、コンソールで次のコマンドを投入する。

console
$ pod install

すると、ライブラリのインストールが行われ、『プロジェクト名.xcworkspace』が生成されるので、これをXCode7から開くことにより取り込まれて使える状態になります。

Swiftソース上での書き方

インポートはこんな書き方

Swift2
import CocoaLumberjack

例えば、viewDidLoad()あたりの処理で、下記のように書くと、コンソールとファイルに書き出されます。

Swift2
defaultDebugLevel = DDLogLevel.Verbose
DDLog.addLogger(DDTTYLogger.sharedInstance())

let fileLogger = DDFileLogger()
fileLogger.rollingFrequency = 60 * 60 * 24
fileLogger.maximumFileSize = 1024 * 1024 
fileLogger.logFileManager.maximumNumberOfLogFiles = 10
DDLog.addLogger(fileLogger)

ログを出したい場所では

Swift2
DDLogDebug("didUpdateToLocation")

とかやればOKです!

でも。。。

info.plistにApplication supports iTunes file sharingをYESと記述しても、iTunesからログファイルを取得することができない。
あれあれ?
調べてみてみたら、Cacheフォルダに吐き出している事実を発見し、設定で変えられるのかな?と思っていましたが、ライブラリのソースコードを直接書き換えてこの問題をクリアーにしました。コメントアウトした部分がキャッシュフォルダをしていしていたので、ドキュメントフォルダにするように書き直しています。

/Pods/Pods/CocoaLumberjack/Core/DDFileLogger.m
- (NSString *)defaultLogsDirectory {
#if TARGET_OS_IPHONE
    // NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *baseDir = paths.firstObject;
    NSString *logsDirectory = [baseDir stringByAppendingPathComponent:@"Logs"];

#else
    NSString *appName = [[NSProcessInfo processInfo] processName];
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
    NSString *basePath = ([paths count] > 0) ? paths[0] : NSTemporaryDirectory();
    NSString *logsDirectory = [[basePath stringByAppendingPathComponent:@"Logs"] stringByAppendingPathComponent:appName];

#endif

    return logsDirectory;
}

以上、ご参考までに