使用 SafariViewController 打开 url 时如果不成功则处理完成

Posted

技术标签:

【中文标题】使用 SafariViewController 打开 url 时如果不成功则处理完成【英文标题】:Handle completion if no success when opening url with SafariViewController 【发布时间】:2020-07-26 15:50:06 【问题描述】:

如果SafariViewController 无法像UIApplication.shared.open 一样打开url,有没有办法处理这种情况? 这是我的功能:

if ["http", "https"].contains(url.scheme?.lowercased() ?? "") 
    // Can open with SFSafariViewController
    let safariViewController = SFSafariViewController(url: url)
    self.present(safariViewController, animated: true) 
        // no bool given?
    
 else 
    // Scheme is not supported or no scheme is given, use openURL
    guard let url = URL(string: urlString) else 
        self.showInvalidUrlAlert()
        return
    
    UIApplication.shared.open(url, completionHandler:  success in
        if !success 
            print("failed")
            self.showInvalidUrlAlert()
        
    )

【问题讨论】:

【参考方案1】:

使您的演示者视图控制器符合SFSafariViewControllerDelegate

class ViewController: SFSafariViewControllerDelegate

并将ViewController 设置为SafariViewController 的代表

safariViewController.delegate = self

然后处理加载状态是否成功使用 didCompleteInitialLoad委托。

func safariViewController(_ controller: SFSafariViewController, didCompleteInitialLoad didLoadSuccessfully: Bool) 
    // Handle loadStatus. 
    print(didLoadSuccessfully)

    // if load unsuccessful, dismiss SFSafariViewController and try to open using openURL
    if !didLoadSuccessfully 
        controller.dismiss(animated: true) 
            // UIApplication.shared.open(..               
        
    


【讨论】:

【参考方案2】:

我不认为 SFSafariViewController 与您的应用提供太多互动/反馈。

根据 Apple 文档:

用户的活动和与 SFSafariViewController 的交互是 对您的应用不可见,无法访问自动填充数据,浏览 历史记录或网站数据。

选择最佳的网页浏览课程

如果您的应用允许用户查看 来自 Internet 上任何地方的网站,使用 SFSafariViewController 班级。如果您的应用自定义、交互或控制显示 网页内容,使用 WKWebView 类。

正如 Apple 建议的那样,您可能想看看 WKWebView 类。

【讨论】:

以上是关于使用 SafariViewController 打开 url 时如果不成功则处理完成的主要内容,如果未能解决你的问题,请参考以下文章

在 UIWebview 之类的 ViewController 中使用 SafariViewController

如何从 SafariViewController 快速获取文本到我们的应用程序?

通过 SafariViewController 安装 MDM 配置文件

区分来自 MobileSafari 与 SafariViewController 的请求

刷新 safariViewController 导致 OAuth2 失败

Swift SafariViewController 动画