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

Xcode 16.1中WKUIDelegate方法未调用问题求助

WKUIDelegate 弹窗方法在Xcode 16.1构建后不触发的解决办法

iOS 18(对应Xcode 16.1)对WKWebView的JavaScript弹窗处理逻辑做了API更新,原有的runJavaScriptAlertPanelWithMessage(_:initiatedByFrame:completionHandler:)方法已被废弃,系统不再调用旧版方法,这就是问题的核心原因。

解决步骤:

  • 替换为新的异步方法
    苹果在iOS 18引入了基于async/await的新版WKUIDelegate弹窗方法,替换旧实现即可恢复功能:

    func webView(_ webView: WKWebView, runJavaScriptAlertPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo) async {
        let alertController = UIAlertController(title: nil, message: message, preferredStyle: UIDevice.current.userInterfaceIdiom == .pad ? .alert : .actionSheet)
        alertController.addAction(
            UIAlertAction(title: "Ok".localized, style: .default)
        )
    
        if let controller = topMostViewController() {
            await controller.present(alertController, animated: true)
        }
    }
    
  • 兼容旧版本系统
    如果需要同时支持iOS 17及以下版本,可以保留旧方法并添加版本标记,同时实现新方法:

    // 兼容iOS 17及更早版本
    @available(iOS, deprecated: 18.0)
    func webView(_ webView: WKWebView, runJavaScriptAlertPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping () -> Void) {
        let alertController = UIAlertController(title: nil, message: message, preferredStyle: UIDevice.current.userInterfaceIdiom == .pad ? .alert : .actionSheet)
        alertController.addAction(
            UIAlertAction(title: "Ok".localized, style: .default, handler: { _ in completionHandler() })
        )
    
        if let controller = topMostViewController() {
            controller.present(alertController, animated: true)
        }
    }
    
    // iOS 18+ 适配新API
    @available(iOS 18.0, *)
    func webView(_ webView: WKWebView, runJavaScriptAlertPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo) async {
        let alertController = UIAlertController(title: nil, message: message, preferredStyle: UIDevice.current.userInterfaceIdiom == .pad ? .alert : .actionSheet)
        alertController.addAction(
            UIAlertAction(title: "Ok".localized, style: .default)
        )
    
        if let controller = topMostViewController() {
            await controller.present(alertController, animated: true)
        }
    }
    

额外检查项:

  • 确认你的WKWebView实例的uiDelegate属性已正确赋值,未被其他代码意外覆盖
  • 排查是否有自定义的WebView拦截逻辑,可能阻止了弹窗请求的传递

内容的提问来源于stack exchange,提问作者G33RY

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 21:42:37