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
pull/2780/head
Lucas Fernandes Nogueira 3 weeks ago committed by GitHub
parent 8cdaacdc6e
commit 9799f0dbab
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -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 SwiftRs
import Tauri import Tauri
import UIKit import UIKit
import os.log
#if targetEnvironment(simulator) #if targetEnvironment(simulator)
var logReady = false var logReady = false
@ -12,24 +13,39 @@ import UIKit
var logReady = true var logReady = true
#endif #endif
var pendingLogs: [(Int, NSString)] = []
var elapsedTime: TimeInterval = 0
var logFlushScheduled = false
@_cdecl("tauri_log") @_cdecl("tauri_log")
func log(level: Int, message: NSString) { func log(level: Int, message: NSString) {
if logReady { if logReady {
os_log(level, message) os_log(level, message)
} else { } 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
// 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
// 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
// better be safe here and wait a few seconds than actually freeze the app in dev mode // in production this isn't a problem
// in production this isn't a problem func scheduleLogFlush() {
DispatchQueue.main.asyncAfter(deadline: .now() + 2) { guard !logFlushScheduled else { return }
os_log(level, message) logFlushScheduled = true
DispatchQueue.main.asyncAfter(deadline: .now() + 5) {
logReady = true logReady = true
flushLogs()
}
}
func flushLogs() {
for (level, message) in pendingLogs {
os_log(level, message)
} }
pendingLogs.removeAll()
} }
func os_log(_ level: Int, _ message: NSString) { func os_log(_ level: Int, _ message: NSString) {

Loading…
Cancel
Save