はじめに
開発中とストアに公開時の設定を変更したいGAのトラッキング ID
、アプリが接続するWebサーバのURL
といったものはビルド時のスキーマを複数個用意して、build、archiveなどを変えることでも変更していました。
他にもmacroでLogの出力をON/OFFをしたりもあります。
:[プロジェクト名]-prefix.pch
# ifdef DEBUG
# define DLog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);
# else
# define DLog(...)
# endif
swiftはpchがないって、困りました。
参考
iOS開発でのNSLogはDEBUGマクロで使おう
http://d.hatena.ne.jp/k2_k_hei/20120511/1336750473
pchファイルの代替
pchファイルの追加も可能だったかと思いますが、swiftらしく
対応してみます。
Appleいわくは
swiftでmacro組むためにCやobjective-cを用いるのはナンセンス
Preprocessor Directivesあたりに記述があります。
対象によってはUtilクラスのクラスメソッドにするのが正しいのかもしれませんが、コードの移行を考えると難しいところもあります。
参考URL
設定の変更
buildターゲットを変えることでパラメータの設定値を変更します
# if DEBUG
let kSETTING_PARAM:String = "DEBUG"
# elseif DEBUG_STAGING
let kSETTING_PARAM:String = "DEBUG_STAGE"
# elseif RELEASE_STAGING
let kSETTING_PARAM:String = "RELEASE_STAGE"
# else
let kSETTING_PARAM:String = "RELEASE"
# endif
macroの代替
func Log(message: String,
function: String = __FUNCTION__,
file: String = __FILE__,
line: Int = __LINE__) {
#if DEBUG
println("INPUT \"\(message)\" (File: \(file), Function: \(function), Line: \(line))")
#elseif DEBUG_STAGING
println("INPUT \(message)")
#else
#endif
}
func LogWithTime(message: String,
function: String = __FUNCTION__,
file: String = __FILE__,
line: Int = __LINE__) {
let now = NSDate()
let dateFormatter = NSDateFormatter()
dateFormatter.timeStyle = .MediumStyle
dateFormatter.dateStyle = .MediumStyle
println("\(dateFormatter.stringFromDate(now)) Message \"\(message)\" (File: \(file), Function: \(function), Line: \(line))")
}
プロジェクトファイルの設定
先に書いたpchの代替を有効にするためには、プロジェクトファイル側に設定が必要です。
Configulationの追加
(2)Configurationを複製
実機転送などのデバッグの場合はDebug
を複製し、adhocを作る場合などはReleaseから複製します
Swift Compliler - Custom Flagの設定
各Configurationを識別するパラメータの頭に-Dをつけて設定します。
Build Setting の追加
(2)Duplicate Only
を選択
(3)複製したBuild Settingでcopyと検索
適当な名前でplistが作られていたり、Product Nameが入っているので変更します。
Schemeの設定
(1)Manage Schemes...
を選択
(2)Scheme名を変更
(3)Configurationを設定
実行してみる
スキーマを変更して、それぞれのConfigurationの設定が有効になっているかを確認します
DEBUG
DEBUGの複製Setting
RELEASEの複製Setting
結果を見て書き換え
func Log(message: String,
function: String = __FUNCTION__,
file: String = __FILE__,
line: Int = __LINE__) {
#if DEBUG
println("INPUT \"\(message)\" (File: \(file), Function: \(function), Line: \(line))")
#elseif DEBUG_STAGING || RELEASE_STAGING
println("INPUT \(message)")
#else
//RELEASEの時は出力しない
#endif
}
参考URL
Transitioning from Objective-C to Swift
http://b2cloud.com.au/tutorial/transitioning-from-objective-c-to-swift/
NSLog デバッグ用の各種ログマクロまとめ
http://qiita.com/yusuga_/items/3751cf2a0b0dbf2eefd8
In absence of preprocessor macros, is there a way to define practical scheme specific flags at project level in Xcode project
http://stackoverflow.com/questions/24111854/in-absence-of-preprocessor-macros-is-there-a-way-to-define-practical-scheme-spe/24112024#24112024
さいごに
swiftになって自動で移行ができず、人力でないと捗らないものが他にもたくさんあります。
言語レベルの仕様変更もまだ油断できません。
先人のTipsありきの手探りでたどり着くことがまだ多いです。
出来ることと、正しい手法かは実際にやってみた方や、知見のある詳しい方からの情報がもっと必要です。