この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
滅多に無いと思いますが、Releaseビルドでのアプリのログ出力を確認したいなと思ったので調べてみることにしました。
環境
- Xcode 14.2
- iOS 16.2
結論
- リリースされているアプリのログ出力を確認するためには、
NSLog
を使用する。 -
print
やdebugPrint
は出力されない。
結論に至った経緯について、こちらの記事を参考にさせていただき自分でも試してみました。確認方法については後述で説明します。
前準備
時間を計測する関数を用意
今回は、出力結果と合わせて経過時間も確認してみようと思い、経過時間測定用の関数を用意しました。
extension ViewController {
enum LogType: String {
case print
case debugPrint
case nsLog
}
private func measure<T>(_ logType: LogType, _ log: @autoclosure () -> T) -> (log: T, duration: String ) {
let startTime = CFAbsoluteTimeGetCurrent()
// ログ出力を実行
let log = log()
let timeElapsed = CFAbsoluteTimeGetCurrent() - startTime
let duration = "?LogType: \(logType.rawValue), 経過時間 \(timeElapsed) 秒です"
return (log, duration)
}
}
ログ処理をviewDidLoadに記述
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// 1. printの実行
let printResult = measure(.print,
print("?Check log: print"))
NSLog(printResult.duration)
// 2. debugPrintの実行
let debugPrintResult = measure(.debugPrint,
debugPrint("?Check log: debugPrint"))
NSLog(debugPrintResult.duration)
// 3. NSLogの実行
let nsLogResult = measure(.nsLog,
NSLog("?Check log: NSLog"))
NSLog(nsLogResult.duration)
}
}
print
から順番に出力結果と処理の経過時間を確認していきます。
Releaseビルドでの出力はNSLog
でしか確認できない為、経過時間のログ出力をNSLog
で実行しています。
配信
Ad Hocでipaファイルをエクスポート
Releaseビルドのログ出力を確認する為にアプリのAd Hoc配信を行います。
アーカイブを行う
Xcode > Product > Archive を選択します。
アーカイブビルドが成功すると、Organizerが表示されます。
配信用のipaファイルをエクスポート
Organizerが表示されたら、Distribute Appを選択します。
次の画面でAd Hocを選択します。
今回はAd Hoc distribution optionsの設定は必要無いので、Nextを選択します。
次の画面でSinginingの方法を問われますが、今回は、検証の結果を確認したいだけなのでAutomatically manage signing を選択してNextを選択します。
最後にExportが出来る画面が表示されるので、任意のフォルダにエクスポートします。
実機にインストール
まず、実機とPCを接続します。
Xcode > Window > Devices and Simulators を選択します。
先ほどエクスポートしたipaファイルをINSTALLED APPSの箇所にドラッグ&ドロップします。
コンソールの出力を確認
アプリのインストールが完了したので、Open Consoleからコンソールを表示します。
コンソールが表示されたら、開始ボタンを押すと様々なログが表示されます。
コンソールで開始ボタンを押した後に、先ほどのインストールしたアプリを実機で起動します。
今回の確認したい出力以外にも沢山のログが表示されている為、結果の絞り込みを行います。
すると、出力結果が表示されました。
出力結果を確認
// print
?LogType: print, 経過時間 0.00019800662994384766 秒です
// debugPrint
?LogType: debugPrint, 経過時間 0.00037097930908203125 秒です
// NSLog
?Check log: NSLog
?LogType: nsLog, 経過時間 3.0994415283203125e-05 秒です
コンソールの出力を確認してみると、NSLog
のみ出力されているのが確認出来ました。
ただし、print
とdebugPrint
については出力はされないが、関数自体は呼ばれている為、経過に時間がかかっているのが分かった。
まとめ
- Releaseビルドでもログ出力をしたい時は、
NSLog
を使用する print
やdebugPrint
はReleaseビルドではログ出力されないが、関数自体は呼ばれる為、パフォーマンスには影響する
おわりに
ログ出力について気になっている部分だったので自分で出力を確認出来て少しスッキリしました。
ログ出力について、この方法だとprint
出力等でもReleaseビルドでも確認出来るよ等ありましたら、優しく教えていただければ嬉しいです。