You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 06:41:05