Xcode 15开启Wait for executable to be launched后print日志不显示求助
解决Xcode 15中本地通知启动App时print语句不显示的问题
问题背景
当在Xcode 15中为Target开启「Wait for executable to be launched」选项,通过本地通知唤醒App时,代码中的print("TEST")这类输出无法在控制台显示,仅OSLogger能正常输出,需要让print语句也能显示。
可行解决方案
1. 重定向print输出到OSLogger
这种启动场景下,系统默认的stdout/stderr未关联到Xcode控制台,通过重定向print到OSLogger可解决问题,且无需修改原有print调用习惯:
import os.log // 自定义OSLogger实例 private let printLogger = OSLog(subsystem: Bundle.main.bundleIdentifier ?? "com.unknown.subsystem", category: "PrintRedirect") // 重写print函数 func print(_ items: Any..., separator: String = " ", terminator: String = "\n") { let output = items.map { "\($0)" }.joined(separator: separator) + terminator os_log("%{public}s", log: printLogger, type: .default, output) }
将这段代码放在App启动入口(比如App.swift或UIApplicationDelegate的启动方法中),所有print调用都会转为OSLogger输出,在控制台正常显示。
2. 手动Attach进程到Xcode
因为App由系统通过本地通知启动,Xcode可能未自动捕获进程:
- 触发本地通知启动App后,打开Xcode的「Debug Navigator」,点击顶部的「Attach to Process」,选择你的App进程。
3. 切换控制台到「All Output」视图
默认控制台可能过滤了部分输出:
- 在Xcode控制台窗口顶部,点击筛选器旁的下拉菜单,选择「All Output」,确保不会遗漏print输出。
说明
「Wait for executable to be launched」模式下,App由系统触发启动而非Xcode直接启动,Xcode是事后attach到进程的,默认print的stdout流未被调试会话捕获;而OSLogger通过系统日志服务传递,所以能正常显示。重定向print到OSLogger是最稳定的方案,无需改变原有代码逻辑。
内容的提问来源于stack exchange,提问作者Peter Lapisu
相关产品推荐
相关产品推荐

