l***@drawleader.com
l***@drawleader.com
  • 发布:37 分钟前
  • 更新:34 分钟前
  • 阅读:20

【报Bug】iOS26 UIScene架构下 H5WEWKWebview 的 JS alert 使用 UIAlertView 导致必现闪退(HBuilderX 5.34 仍存在)

分类:uni-app

产品分类: uniapp/App

PC开发环境操作系统: Mac

PC开发环境操作系统版本号: macOS 15.8.2

HBuilderX类型: 正式

HBuilderX版本号: 5.34

手机系统: iOS

手机系统版本号: iOS 26

手机厂商: 苹果

手机机型: iPhone 17(iOS 26.6.2 模拟器环境实测,云包在 iOS26 真机同样反馈闪退)

页面类型: vue

vue版本: vue3

打包方式: 离线

项目创建方式: HBuilderX

示例代码:

对照实验(同一台 iOS 26.6.2 模拟器):

  • 4.87 运行时(1.9.9.81635,非 UIScene):正常
  • 5.33/5.34 运行时(1.9.9.81739,UIScene):必崩
  • 5.33 离线打包 + 工程改回 AppDelegate:恢复正常
    说明:与业务代码无关,新旧 shim 代码均崩,唯一相关变量是运行时版本与工程架构。

操作步骤:
  1. HBuilderX 5.34 云打包或 5.33/5.34 离线 SDK 打包
  2. 宿主工程为 UIScene 架构
  3. iOS 26 设备上 H5 触发 window.alert()(例如关闭弹窗时的提示)
  4. 必现闪退

预期结果:

iOS 26 + UIScene 架构下,H5 的 alert/confirm 弹窗正常显示,不闪退。

实际结果:

App 闪退:NSObjectNotAvailableException — UIAlertView is deprecated and unavailable for UIScene based applications please use UIAlertController!,完整调用栈见问题描述。

bug描述:

【环境】

  • HBuilderX 5.34 正式版云打包 + iOS 离线SDK 5.33/5.34(运行时构建号均为 1.9.9.81739)
  • 手机系统 iOS 26.6.2(iOS 模拟器环境实测;用户真机 iOS 26 同样反馈闪退)
  • 宿主工程采用 UIScene 生命周期(Info.plist 含 UIApplicationSceneManifest)

【崩溃信息】
*** Terminating app due to uncaught exception 'NSObjectNotAvailableException'
reason: 'UIAlertView is deprecated and unavailable for UIScene based applications please use UIAlertController!'

【崩溃调用栈(.ips 崩溃报告关键帧)】

UIKitCore    +[NSException raise:format:] +128  
UIKitCore    -[UIAlertView initWithFrame:] +184  
UIKitCore    -[UIAlertView initWithTitle:message:delegate:cancelButtonTitle:otherButtonTitles:] +100  
DCUniBase    -[H5WEWKWebview webView:runJavaScriptAlertPanelWithMessage:initiatedByFrame:completionHandler:] +96  
WebKit       WebKit::UIDelegate::UIClient::runJavaScriptAlert +520  
WebKit       WebKit::WebPageProxy::runJavaScriptAlert(IPC 同步消息 dispatchSyncMessage)

【复现步骤】

  1. HBuilderX 5.34 云打包(或 5.33/5.34 离线 SDK 打包,运行时 1.9.9.81739)
  2. 宿主工程为 UIScene 架构
  3. iOS 26 设备上,H5 页面任何触发 window.alert() 的操作(如关闭弹窗时的提示)
  4. App 必现闪退(SIGABRT)

【对照实验(同一台 iOS 26.6.2 模拟器)】

构建 运行时构建号 工程架构 结果
2026-07 云打包 1.9.9.81635(HBuilderX 4.87) 非 UIScene 正常
5.34 云打包 1.9.9.81739 UIScene 闪退
5.33 离线打包 1.9.9.81739 UIScene 闪退
5.33 离线打包(工程改回 AppDelegate 生命周期) 1.9.9.81739 非 UIScene 正常

【结论与诉求】

  1. 根因:DCUniBase 的 H5WEWKWebview 实现 WKUIDelegate 的 runJavaScriptAlertPanelWithMessage: 时仍使用 UIAlertView;iOS 26 上 UIScene 应用创建 UIAlertView 直接抛 NSObjectNotAvailableException
  2. H5WEWKWebview 同时实现了 runJavaScriptConfirmPanelWithMessage:,疑似同样使用 UIAlertView,请一并排查修复
  3. 与问题 219977 相同根因,当时官方回复"将工程改成之前的 AppDelegate 即可",但 Apple 已要求上架应用适配 UIScene,该临时方案不可持续
  4. 请在后续 SDK 中将 UIAlertView 全部替换为 UIAlertController,并在 UIScene 架构 + iOS 26 下验证 alert/confirm/prompt 全链路
37 分钟前 负责人:无 分享
已邀请:
Ask小助手

Ask小助手 - Ask社区AI助手

欢迎到专业群( uni-app 官方技术交流群 1 ) 咨询,群中有相关专业的管理员和群友。

感谢这份反馈。先给出评审结论:这是一份信息完整、证据链闭合的高质量 bug 反馈,问题成立,可直接进入官方排查流程。以下是具体评审意见。

一、反馈完整性评审

  1. 标题与问题描述:标题准确点明了“iOS 26 + UIScene 架构 + H5WEWKWebview + UIAlertView + 必现闪退”等关键要素;描述中附带了完整的异常信息原文(NSObjectNotAvailableException 及系统 reason)和 .ips 崩溃报告关键调用栈,从 UIKitCore 异常抛出、DCUniBase 中 H5WEWKWebview 的 runJavaScriptAlertPanelWithMessage: 实现,到 WebKit 的 IPC 同步消息链路完整清晰,官方人员可以直接定位到 WKUIDelegate 实现处的代码,无需二次排查崩溃点。描述清晰,无需要补充的核心内容。

  2. 代码示例:本反馈未附业务代码,但提供了四组对照实验,采用控制变量法,唯一变量是“运行时版本 + 工程架构”,同时排除了业务代码差异(新旧 shim 均崩)、打包方式差异(云打包/离线打包均崩),并验证了改回 AppDelegate 后恢复正常。对于这类框架层问题,对照实验比业务代码更有说服力,复现不依赖特定业务代码(任何触发 window.alert() 的 H5 页面均可复现)。如需进一步补充,建议以文字或代码形式直接贴出最小化复现工程的关键配置(如 Info.plist 的 UIApplicationSceneManifest 节点);需要说明的是,我无法识别附件,补充内容请直接以文本形式提供。

  3. 复现步骤:清晰可复现,按“5.34 云打包或 5.33/5.34 离线 SDK + UIScene 宿主工程 + iOS 26 + 触发 window.alert()”四步即可稳定触发,官方按此步骤可直接复现验证。

  4. 预期结果:合理。iOS 26 + UIScene 下 alert/confirm 正常显示符合系统规范;但结合当前官方适配状态(见下文),在 UIScene 架构下达成该预期需等待官方适配完成,当前版本的达成路径是回退 AppDelegate 生命周期。

  5. 实际结果:与崩溃栈、系统行为自洽,不属于误报,是真实的适配缺口。

  6. 分类信息:完整,包含 HBuilderX 版本、离线 SDK 版本、运行时构建号、iOS 版本、机型、Vue 版本等,满足归档与回归验证需要。

二、bug 成立性判断

该问题成立,且有官方已确认的同根因问题作为依据:

  1. iOS 26 上,基于 UIScene 的应用创建 UIAlertView 会被系统直接抛出 NSObjectNotAvailableException 并强制要求改用 UIAlertController,你提供的崩溃栈与该系统行为完全吻合。

  2. 官方此前已确认过同根因问题——iOS 26 系统下 uniMP 内部使用 UIAlertView 发生崩溃,当时的官方结论为:“UniMPSDK 不支持 UIScene 的场景,将工程改成之前的 AppDelegate 即可”。你提到的 219977 的官方回复口径与此一致。

  3. 关于 UIScene 适配的整体进度,官方目前的口径是:官方此前回复 uni-app x 于 5.21 版本起支持 UIScene;uni-app(JS 引擎版)目前还没有排期;ask 社区中 2026 年 4 月已有开发者提问“什么时候适配基于 UIScene 场景的生命周期”,截至目前尚无官方回复,也未给出具体适配时间节点。

  4. 你对 runJavaScriptConfirmPanelWithMessage: 疑似同样使用 UIAlertView 的排查提示,以及要求在 UIScene 架构 + iOS 26 下验证 alert/confirm/prompt 全链路的建议,方向合理,属于官方适配 UIScene 时需要一并覆盖的范围。

三、当前可用方案与诉求回应

  1. 当前官方确认可用的规避方案仍是:将宿主工程改回 AppDelegate 生命周期。你的对照实验(5.33 离线打包 + 工程改回 AppDelegate 后恢复正常)也验证了该方案有效。

  2. 你指出的“Apple 已要求上架应用适配 UIScene,回退 AppDelegate 不可持续”这一反馈合理且有价值。关于将 UIAlertView 全部替换为 UIAlertController 并完成全链路验证的诉求,建议持续关注后续版本的发版说明;由于 uni-app 的 UIScene 适配目前尚无明确排期,我无法在此承诺具体修复版本和时间。

  3. 补充参考:官方此前回复 uni-app x 已于 5.21 版本起支持 UIScene,说明官方在 UIScene 方向已有适配动作;你当前使用的是 uni-app(JS 引擎版)项目,两者是不同体系,uni-app 侧的适配进度请以官方后续发版说明为准。

如需进一步跟进 UIScene 适配进度或交流该问题的细节,欢迎到专业群咨询,群中有相关专业的管理员和群友:uni-app 官方技术交流群 1

内容为 AI 生成,仅供参考

要回复问题请先登录或注册