fix(log): iOS simulator freezing due to early logging (#2802)

* fix(log): iOS simulator freezing due to early logging

follow-up for #2626

* use logger

* set logReady
This commit is contained in:
Lucas Fernandes Nogueira
2025-06-24 14:37:48 -03:00
committed by GitHub
parent 8cdaacdc6e
commit 9799f0dbab
2 changed files with 30 additions and 8 deletions
+6
View File
@@ -0,0 +1,6 @@
---
"log": patch:bug
"log-js": patch:bug
---
Fixes iOS simulator still freezing sometimes due to early logging.
+24 -8
View File
@@ -5,6 +5,7 @@
import SwiftRs
import Tauri
import UIKit
import os.log
#if targetEnvironment(simulator)
var logReady = false
@@ -12,26 +13,41 @@ import UIKit
var logReady = true
#endif
var pendingLogs: [(Int, NSString)] = []
var elapsedTime: TimeInterval = 0
var logFlushScheduled = false
@_cdecl("tauri_log")
func log(level: Int, message: NSString) {
if logReady {
os_log(level, message)
} else {
dispatch_log(level, message)
pendingLogs.append((level, message))
scheduleLogFlush()
}
}
func dispatch_log(_ level: Int, _ message: NSString) {
// delay logging when the logger isn't immediately available
// in some cases when using the simulator the app would hang when calling os_log too soon
// better be safe here and wait a few seconds than actually freeze the app in dev mode
// in production this isn't a problem
DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
os_log(level, message)
// delay logging when the logger isn't immediately available
// in some cases when using the simulator the app would hang when calling os_log too soon
// better be safe here and wait a few seconds than actually freeze the app in dev mode
// in production this isn't a problem
func scheduleLogFlush() {
guard !logFlushScheduled else { return }
logFlushScheduled = true
DispatchQueue.main.asyncAfter(deadline: .now() + 5) {
logReady = true
flushLogs()
}
}
func flushLogs() {
for (level, message) in pendingLogs {
os_log(level, message)
}
pendingLogs.removeAll()
}
func os_log(_ level: Int, _ message: NSString) {
switch level {
case 1: Logger.debug(message as String)