Skip to content

Commit 58e0b1c

Browse files
committed
fix(log): iOS simulator freezing due to early logging
follow-up for #2626
1 parent d46778e commit 58e0b1c

File tree

2 files changed

+37
-12
lines changed

2 files changed

+37
-12
lines changed

.changes/fix-log-freeze.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
"log": patch:bug
3+
"log-js": patch:bug
4+
---
5+
6+
Fixes iOS simulator still freezing sometimes due to early logging.

plugins/log/ios/Sources/LogPlugin.swift

Lines changed: 31 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,38 +5,57 @@
55
import SwiftRs
66
import Tauri
77
import UIKit
8+
import os.log
89

910
#if targetEnvironment(simulator)
1011
var logReady = false
1112
#else
1213
var logReady = true
1314
#endif
1415

16+
var pendingLogs: [(Int, NSString)] = []
17+
var elapsedTime: TimeInterval = 0
18+
var logFlushScheduled = false
19+
1520
@_cdecl("tauri_log")
1621
func log(level: Int, message: NSString) {
1722
if logReady {
1823
os_log(level, message)
1924
} else {
20-
dispatch_log(level, message)
25+
pendingLogs.append((level, message))
26+
scheduleLogFlush()
2127
}
2228
}
2329

24-
func dispatch_log(_ level: Int, _ message: NSString) {
25-
// delay logging when the logger isn't immediately available
26-
// in some cases when using the simulator the app would hang when calling os_log too soon
27-
// better be safe here and wait a few seconds than actually freeze the app in dev mode
28-
// in production this isn't a problem
29-
DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
30+
// delay logging when the logger isn't immediately available
31+
// in some cases when using the simulator the app would hang when calling os_log too soon
32+
// better be safe here and wait a few seconds than actually freeze the app in dev mode
33+
// in production this isn't a problem
34+
func scheduleLogFlush() {
35+
guard !logFlushScheduled else { return }
36+
logFlushScheduled = true
37+
38+
DispatchQueue.main.asyncAfter(deadline: .now() + 10) {
39+
flushLogs()
40+
}
41+
}
42+
43+
func flushLogs() {
44+
for (level, message) in pendingLogs {
3045
os_log(level, message)
31-
logReady = true
3246
}
47+
pendingLogs.removeAll()
3348
}
3449

3550
func os_log(_ level: Int, _ message: NSString) {
51+
os_log("%{public}@", log: OSLog.default, type: osLogType(from: level), message)
52+
}
53+
54+
func osLogType(from level: Int) -> OSLogType {
3655
switch level {
37-
case 1: Logger.debug(message as String)
38-
case 2: Logger.info(message as String)
39-
case 3: Logger.error(message as String)
40-
default: break
56+
case 1: return .debug
57+
case 2: return .info
58+
case 3: return .error
59+
default: return .default
4160
}
4261
}

0 commit comments

Comments
 (0)