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

follow-up for #2626
pull/2802/head
Lucas Nogueira 3 weeks ago
parent d46778e80b
commit 58e0b1c83f
No known key found for this signature in database
GPG Key ID: 7C32FCA95C8C95D7

@ -0,0 +1,6 @@
---
"log": patch:bug
"log-js": patch:bug
---
Fixes iOS simulator still freezing sometimes due to early logging.

@ -5,6 +5,7 @@
import SwiftRs
import Tauri
import UIKit
import os.log
#if targetEnvironment(simulator)
var logReady = false
@ -12,31 +13,49 @@ 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) {
// 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() + 10) {
flushLogs()
}
}
func flushLogs() {
for (level, message) in pendingLogs {
os_log(level, message)
logReady = true
}
pendingLogs.removeAll()
}
func os_log(_ level: Int, _ message: NSString) {
os_log("%{public}@", log: OSLog.default, type: osLogType(from: level), message)
}
func osLogType(from level: Int) -> OSLogType {
switch level {
case 1: Logger.debug(message as String)
case 2: Logger.info(message as String)
case 3: Logger.error(message as String)
default: break
case 1: return .debug
case 2: return .info
case 3: return .error
default: return .default
}
}

Loading…
Cancel
Save