如何在Swift中的Webview中打开外部链接?

3

我完全不了解Swift,我只是需要一个包含我的网站的webview应用程序。除了"tel"、"mailto"或"whatsapp"等外部链接之外,一切似乎都很好。当我点击它们时,什么也没发生。我已经搜索了许多相关标题并尝试了许多方法,但链接仍然无法使用。我尝试的最后一件事如下。有人能帮忙吗?


import UIKit
import WebKit

class ViewController: UIViewController, WKUIDelegate, WKNavigationDelegate {
    
    var webView: WKWebView!
    
    
    override func loadView() {
        let webConfiguration = WKWebViewConfiguration()
        webView = WKWebView(frame: .zero, configuration: webConfiguration)
        webView.uiDelegate = self
        view = webView
    }
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let myURL = URL(string:"https://www.sepettte.com")
        let myRequest = URLRequest(url: myURL!)
        webView.load(myRequest)
    }

    func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: Error) {
      
      guard let failingUrlStr = (error as NSError).userInfo["NSErrorFailingURLStringKey"] 
      as? String  else { return }
      let failingUrl = URL(string: failingUrlStr)!

      switch failingUrl {
      
        case _ where failingUrlStr.hasPrefix("fb:"):
        if #available(iOS 10.0, *) {
           UIApplication.shared.open(failingUrl, options: [:], completionHandler: nil)
           return
        }
          
        case _ where failingUrlStr.hasPrefix("whatsapp:"):
        if UIApplication.shared.canOpenURL(failingUrl) {
          UIApplication.shared.open(failingUrl, options: [:], completionHandler: nil)
          return
        }

        case _ where failingUrlStr.hasPrefix("mailto:"):
        if UIApplication.shared.canOpenURL(failingUrl) {
          UIApplication.shared.open(failingUrl, options: [:], completionHandler: nil)
          return
        }
          
        case _ where failingUrlStr.hasPrefix("tel:"):
        if UIApplication.shared.canOpenURL(failingUrl) {
          UIApplication.shared.open(failingUrl, options: [:], completionHandler: nil)
          return
        }

      default: break
      }
    }
}


4
提醒一下,苹果不允许仅是网页浏览器封装的应用程序。 - EmilioPelaez
2
实际上他们是可以的。我的应用程序现在就在AppStore上,但问题只是链接。我只是认为必须有一个解决方法。 - Hakan göçmen
1个回答

3

尝试在实现decidePolicyFor navigationAction时拦截WKWebView上的请求:

class ViewController: UIViewController, WKNavigationDelegate {
    
    @IBOutlet weak var webView: WKWebView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        webView.uiDelegate = self
        webView.navigationDelegate = self

        webView.allowsBackForwardNavigationGestures = true

        let myURL = URL(string:"https://www.sepettte.com")
        let myRequest = URLRequest(url: myURL!)
        webView.load(myRequest)
    }
    
    func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: (WKNavigationActionPolicy) -> Void) {
        
        guard let redirectURL = (navigationAction.request.url) else {
            decisionHandler(.cancel)
            return
        }
        
        if (redirectURL.absoluteString.contains("tel:") ) {
            UIApplication.shared.open(redirectURL, options: [:], completionHandler: nil)
        }
        
        if (redirectURL.absoluteString.contains("whatsapp") ) {
            UIApplication.shared.open(redirectURL, options: [:], completionHandler: nil)
        }
        
        decisionHandler(.allow)
    }
}

extension ViewController: WKUIDelegate {

    func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? {
        
        guard let url = navigationAction.request.url else {
            return nil
        }
        
        guard let targetFrame = navigationAction.targetFrame, targetFrame.isMainFrame else {
            webView.load(URLRequest(url: url))
            return nil
        }
        return nil
    }
}

输出:

输入图像描述


(注:该段内容为HTML代码,已翻译为中文)

我已经尝试使用您的编辑再次尝试,但仍然没有任何反应。我还添加了webView.navigationDelegate = self,但它没有起作用。我还漏掉了其他东西吗? - Hakan göçmen
我完全做了同样的事情,但现在它给出了一个致命错误:“Thread 1: Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value”。 - Hakan göçmen
我连接了插座,但是只看到一个白屏。当我试图拖动页面时,可以看到背景中的网站。我需要做一些关于Webkit视图的工作吗? - Hakan göçmen
@Hakangöçmen,请查看更新后的答案。 - RTXGamer
1
一切都没有出现任何错误,这正是我想要的。这真的帮了我很大忙,非常感谢 :) - Hakan göçmen
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接