Kim Carlo
Kim Carlo

Reputation: 1223

WKWebview: how to prevent Laravel Page links from opening in safari?

I am new to swift.

I built a web application and serving it as an iOS app using WKWebView (this is for internal company use only).

In the web app, I used laravel pagination, this works properly on a browser and android webview.

what happens on iOS is, when I click the page number link inside the WKWebView, the link opens up in safari. What I want to do is open it on the same Webview.

This is my code inside 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
}}

Upvotes: 1

Views: 276

Answers (1)

Kamran
Kamran

Reputation: 15258

Implement decidePolicyFor and set policy as below,

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)
}

Upvotes: 0

Related Questions