【问题标题】:WKWebview: how to prevent Laravel Page links from opening in safari?WKWebview:如何防止 Laravel 页面链接在 safari 中打开?
【发布时间】:2019-09-11 13:28:02
【问题描述】:

我是 swift 新手。

我使用 WKWebView 构建了一个 Web 应用程序并将其作为 iOS 应用程序提供(这仅供公司内部使用)。

在网络应用程序中,我使用了 laravel 分页,这在浏览器和 android webview 上都能正常工作。

在 iOS 上发生的情况是,当我单击 WKWebView 内的页码链接时,该链接会在 safari 中打开。我想做的是在同一个 Webview 上打开它。

这是我在 ViewController.swift

中的代码
import UIKit
import WebKit

class ViewController: UIViewController, WKNavigationDelegate {
var webView : WKWebView!

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.


    let url = URL(string: "https://domain-online.asia")!
    let urlRequest = URLRequest(url: url)
    webView.load(urlRequest)

    let refresh = UIBarButtonItem(barButtonSystemItem: .refresh, target: webView, action: #selector(webView.reload))
    toolbarItems = [refresh]
    navigationController?.isToolbarHidden = false

}

override func loadView() {
    let source: String = "var meta = document.createElement('meta');" +
        "meta.name = 'viewport';" +
        "meta.content = 'width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no';" +
        "var head = document.getElementsByTagName('head')[0];" + "head.appendChild(meta);";

    let script: WKUserScript = WKUserScript(source: source, injectionTime: .atDocumentEnd, forMainFrameOnly: true)
    let userContentController: WKUserContentController = WKUserContentController()
    let conf = WKWebViewConfiguration()
    conf.userContentController = userContentController
    userContentController.addUserScript(script)
    webView = WKWebView(frame: CGRect.zero, configuration: conf)
    webView.navigationDelegate = self
    view = webView
}

func webView(webView: WKWebView!, createWebViewWithConfiguration configuration: WKWebViewConfiguration!, forNavigationAction navigationAction: WKNavigationAction!, windowFeatures: WKWindowFeatures!) -> WKWebView! {
    if navigationAction.targetFrame == nil {
        webView.load(navigationAction.request)
    }
    return nil
}}

【问题讨论】:

    标签: swift xcode wkwebview


    【解决方案1】:

    实现decidePolicyFor并设置policy如下,

    func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
        guard navigationAction.navigationType == .linkActivated,
            let url = navigationAction.request.url,
            url.host?.contains("domain-online.asia") == false,
            UIApplication.shared.canOpenURL(url) else {
            decisionHandler(.allow)
            return
        }
        UIApplication.shared.open(url)
        decisionHandler(.cancel)
    }
    

    【讨论】:

      猜你喜欢
      • 2016-11-21
      • 2015-08-16
      • 2020-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多