Skip to content

等待 Expo 支持 Xcode 27 的 UIScene 生命周期以修复 iOS 27 启动崩溃 #46

Description

@leon-zym

当前阻塞状态

问题

使用 expo run:ios --device 通过 Xcode 27 / iOS 27 SDK 构建并安装 PlogKit 后,App 在 iOS 27 物理机上启动时立即崩溃。

环境

  • Expo SDK:57.0.1
  • React Native:0.86.0
  • expo-dev-client:57.0.5
  • Xcode:27.0(27A5218g)
  • iOS SDK:27.0(24A5380g)
  • 设备:iPhone 15 Pro,iOS 27.0(24A5390f)

已确认根因

Expo SDK 57 的 iOS prebuild 模板仍使用旧的 UIApplicationDelegate / UIWindow 生命周期:

  • Info.plist 缺少 UIApplicationSceneManifest
  • AppDelegate 直接创建并持有 UIWindow
  • AppDelegate 未实现 application(_:configurationForConnecting:options:)

iOS 27 会对使用 iOS 27 SDK 构建、但未采用 UIScene 生命周期的 App 执行致命断言,因此 App 在 React Native、Skia 和业务代码开始运行前被 UIKit 终止。

崩溃报告的稳定特征:

Exception: EXC_BREAKPOINT (SIGTRAP)
Termination: Trace/BPT trap: 5
Top frame:
___UIApplicationEvaluateRuntimeIssueForNoSceneLifecycleAdoption_block_invoke

复现

  1. 使用 Xcode 27:

    pnpm ios:device
  2. 在 iOS 27 物理机上启动 com.leonzym.plogkit

  3. App 在约 2–3 秒内退出,并生成 PlogKit-*.ips

可使用以下命令构造紧凑的启动探针:

xcrun devicectl device process launch \
  --device "<device>" \
  --terminate-existing \
  --console \
  --timeout 10 \
  com.leonzym.plogkit

当前输出:

Launched application with com.leonzym.plogkit bundle identifier.
Waiting for the application to terminate…
The app terminated with the exit code 0.

连续多次启动均产生相同的 .ips 崩溃报告。

已排除

  • 不是仓库中 ios/ 生成物过期:在临时目录执行全新的 Expo SDK 57 expo prebuild --platform ios --clean,仍生成相同的非 UIScene 生命周期结构。
  • 不是 Metro 或 DEV_CLIENT_DEFAULT_LAUNCHER_URL=http://localhost:8081:传入显式 development-client URL 后仍产生相同的 UIKit 崩溃。
  • 不是签名、Hermes、Skia 或业务代码初始化问题:崩溃发生在 UIKit 创建 scene 时,调用栈未进入 React Native 或 App 代码。

处理策略

优先等待 Expo 发布正式支持 Xcode 27 / iOS 27 UIScene 生命周期的版本,然后升级并重新生成原生工程。

在此之前:

  • 不直接手改生成的 ios/
  • 如必须在物理机上构建,可评估使用 iOS 26 SDK 构建;Apple 表示旧 SDK 构建的 App 在 iOS 27 上不会执行该强制检查。
  • 日常开发可继续使用 iOS 26 模拟器。

完成条件

  • 升级到包含 UIScene 生命周期支持的 Expo / React Native 版本。
  • expo prebuild --clean 生成正确的 scene 配置和生命周期集成,无需手改 ios/
  • 使用 Xcode 27 / iOS 27 SDK 构建。
  • App 在 iOS 27 物理机上稳定启动,启动探针不再产生 PlogKit-*.ips
  • pnpm verify 通过。
  • 原生配置变更按仓库规则通过完整双端 E2E。

参考

Metadata

Metadata

Assignees

Labels

bugSomething isn't workingready-for-human需要人工实现

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions