WKWebView链接无法工作

5
我构建了一个Swift iOS应用程序,唯一的目的是使用WKWebView显示网站。尽管这很好用,但是点击链接(例如[mailto:]按钮)时无法打开任何内容!有没有人有解决此问题的方法?我已经阅读了很多关于解决此问题的文章,但是不知道从哪里开始。感谢您的帮助。
【更新:】下面的代码展示了解决方案。
import UIKit
import WebKit

class ViewController: UIViewController, WKNavigationDelegate {

    @IBOutlet var containerView : UIView! = nil
    var webView: WKWebView?

    override func loadView() {
        super.loadView()

        self.webView = WKWebView()
        self.view = self.webView!
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        webView?.navigationDelegate = self
        let url = NSURL(string:"https://google.de")
        let req = NSURLRequest (URL: url!)
        self.webView!.loadRequest(req)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

    override func prefersStatusBarHidden() -> Bool {
        return true
    }

    func webView(webView: WKWebView, decidePolicyForNavigationAction navigationAction: WKNavigationAction, decisionHandler: (WKNavigationActionPolicy) -> Void) {

        let url = navigationAction.request.URL?.absoluteString
        let url_elements = url!.componentsSeparatedByString(":")

        switch url_elements[0] {
        case "mailto":
            openCustomApp("mailto://", additional_info: url_elements[1])
            decisionHandler(.Cancel)

        default:

        }

        decisionHandler(.Allow)
    }

    func openCustomApp(urlScheme:String, additional_info:String){

        if let requestUrl:NSURL = NSURL(string:"\(urlScheme)"+"\(additional_info)") {
            let application:UIApplication = UIApplication.sharedApplication()
            if application.canOpenURL(requestUrl) {
                application.openURL(requestUrl)
            }
        }
    }
}

1
看起来不错。你调试了 decidePolicyForNavigationAction 吗?例如,URL 是什么? 基本上,你只需要 mailto://tes@test.com - OhadM
你刚刚解决了这个问题。下面的答案是正确的方法,上面的代码展示了解决方案。我的唯一问题是mailto:链接格式不正确!感谢大家。 - OYPS
1个回答

8
你需要实现以下方法(是 WebKit 的一部分)来解析这样的 URL:
func webView(webView: WKWebView, decidePolicyForNavigationAction navigationAction: WKNavigationAction, decisionHandler: (WKNavigationActionPolicy) -> Void)

思路是编写 if 语句来检查特定的 URL 类型,然后再进行决策。更多信息请参见此处: 请注意,在 Swift 3 中,一些代理的语法略有改变 - 在使用教程时需要牢记这一点。如果您已经发现了这个问题,但遇到了错误,请发布您的代码。 编辑: 对于其他遇到此问题的人,需要记住您需要正确地格式化电子邮件链接,例如:mailto://test@test.com(如 OP 的评论中所述,由 OhadM 提供)。

谢谢迄今为止的帮助,我找到了您发布的GitHub示例,但我不确定如何在哪里放置它以及如何使用它。 - OYPS
@ChrisNeumaier 你必须在使用 WebKit 的 ViewController 中使用它。在你的类中开始输入它,Xcode 将帮助你完成代码框架。该方法已经作为 WebKit 的一部分存在 - 就像 viewDidLoad 是 UIKit 的一部分一样。decidePolicyForNavigationAction 可以帮助你决定如何处理 URL。 - tech4242
我更新了我的原始帖子,并附上了我的ViewController,我尝试了你建议的函数,但无法使其正常工作。 - OYPS
@ChrisNeumaier 你至少应该在你发布的代码中放上你的实现。如果你不展示给我们看,我也无法看出你哪里做错了,这样是无法让它正常工作的。 - tech4242
你说得对。我已经更新了上面的代码块。网站仍然可以正常打开,但如果我点击邮件链接[mailto:],则不会发生任何事情。我只是想用示例代码尝试一下,以便理解这个概念。 - OYPS
1
@ChrisNeumaier 很高兴你解决了问题 - 我看到了你在帖子下面的另一个评论。我会在我的答案中更新格式提示(以防有人偶然发现)。 - tech4242

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