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

点击Safari完成按钮后执行代码?safariViewControllerDidFinish不触发如何解决

问题解决:SFSafariViewController点击完成后代理方法不触发

核心问题原因

  • 代理设置时机错误:你先调用了present方法展示SFSafariViewController,之后才设置delegate,会导致代理绑定未生效
  • 代理方法位置错误:safariViewControllerDidFinish方法被嵌套在了其他业务方法内部,没有放在QRScannerController类的顶级作用域,系统无法识别到这个代理实现
  • 多余的dismiss调用:safariViewControllerDidFinish触发时,系统已经默认会执行SFSafariViewController的dismiss操作,你在方法内主动调用controller.dismiss属于重复无效操作

修正后代码示例

import SafariServices

class QRScannerController: UIViewController, WKNavigationDelegate, SFSafariViewControllerDelegate {

    // 示例:在触发打开Safari的业务方法内实现以下逻辑
    func openSafari(urls: String) {
        guard let url = URL(string: urls) else { return }
        let vc = SFSafariViewController(url: url)
        // 先设置代理,再执行present操作
        vc.delegate = self
        present(vc, animated: true, completion: nil)
    }
    
    // 代理方法必须放在类的顶级作用域,不能嵌套在其他方法内部
    func safariViewControllerDidFinish(_ controller: SFSafariViewController) {
        // 无需手动调用dismiss,直接执行你的自定义代码即可
        // do your code
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 00:36:02