Swift ShouldStartLoadWith not working when detect url - swift

My application contains Webview To Show Payment Form and when we have done with filling data we can push Done button then Webview will redirect to other Url. I've already searched for this function and I found shouldStartLoadWith function to solve this problem but when I'm implementing this, it's not working
Here is my Code:
func webView(_ webView: UIWebView, shouldStartLoadWith request: URLRequest, navigationType: UIWebViewNavigationType) -> Bool {
if request.url?.absoluteString == "https://xyzbank.com" {
print("SUCCESS")
return false
}
print("NOT SUCCESS")
return true
}
It's not print either of them.
Here is the rest of my code: I think that i've already called the delegate method of webview but it's still not working
override func viewDidLoad() {
super.viewDidLoad()
hud.textLabel.text = "Processing..."
hud.show(in: self.view)
let mpayment: Payment = params.payment
mywebview.navigationDelegate = self
//Showing webview url....
}
func webView(webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: NSError) {
print(error.localizedDescription)
}
func webView(webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {
print("Start to load")
}
func webView(webView: WKWebView, didFinishNavigation navigation: WKNavigation!) {
print("DID FINISH NAVIGATION")
}
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
self.hud.textLabel.text = "Success"
self.hud.detailTextLabel.text = nil
self.hud.dismiss(animated: true)
}
func webView(_ webView: UIWebView, shouldStartLoadWith request: URLRequest, navigationType: UIWebViewNavigationType) -> Bool {
if request.url?.absoluteString == "https://example.com" {
print("SUCCESS")
return false
}
print("NOT SUCCESS")
return true
}

Actually, as i seen your webview is using the newer version WKWebview but shouldStartLoadWith function is using for UiWebview instead, For WkWebview is we should using with decisionHandler function.
The code should be look like this:
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: #escaping ((WKNavigationActionPolicy) -> Void)) {
print("webView:\(webView) decidePolicyForNavigationAction:\(navigationAction) decisionHandler:\(decisionHandler)")
if let url = navigationAction.request.url {
print(url.absoluteString)
if url.absoluteString.hasPrefix("https://example.com"){
print("SUCCESS")
}
}
decisionHandler(.allow)
}

Related

WKWebView not displaying after successful load, only seeing black screen

I'm new to swift & am attempting to open a login page, login, use the WKNavigationDelegate to get the redirect uri and save the response. I was able to open the url using UIApplication.shared.open but attempting to hit the url using WKWebview, I am getting a loaded response but no view appears.
Am I not declarling the view correctly or is WKWebView not supposed to be used in that manner? This is the code i'm running, its building succesfully and responding that its 'loaded'. Any help would be be appreciated thanks.
import UIKit
import WebKit
class ViewController: UIViewController, WKUIDelegate, WKNavigationDelegate {
// The webview
var webViewObj: WKWebView!
var webNav: WKNavigation!
// this calls the dbhelper to create a db and a table
let db = DBHelper()
var list = [DBGrade]()
override func loadView() {
super.loadView()
let webConfiguration = WKWebViewConfiguration()
webViewObj = WKWebView(frame: .zero, configuration: webConfiguration)
}
override func viewDidLoad() {
super.viewDidLoad()
let url = URL(string: "https://www.hackingwithswift.com")
let request = URLRequest(url: url!)
webViewObj.navigationDelegate = self
self.webViewObj.uiDelegate = self
webViewObj.load(request)
}
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
print("loaded")
}
func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? {
if navigationAction.targetFrame == nil {
webView.load(navigationAction.request)
}
return nil
}
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: #escaping (WKNavigationActionPolicy) -> Void) {
let hostStr = String(describing: navigationAction.request.url)
let host = hostStr
if host.range(of: "hackingwithswift.com") != nil {
decisionHandler(.allow)
print("did it")
return
}
else{
decisionHandler(.cancel)
}
}
}
So moving my delcaration of 'self.webViewObj.uiDelegate = self' & adding 'view = webViewObj' to the loadView() function worked & I'm able to see the webpage appear.

WebView Content size issue in swift

I have a web view in a view controller which is loaded from a url coming from server. The content coming inside the webview is very small and unreadable.
I've implemented all the code but I'm confused as to why it is not showing properly. This is how content is shown, content start from under the header image,
This is the code used to load the url in the webview:
func loadWeb(webURL: String) {
DispatchQueue.main.async {
let url = URL(string: webURL)
self.webView.navigationDelegate = self
self.webView.load(URLRequest(url: url!))
self.view.makeToastActivity(.center)
self.webView.uiDelegate = self
self.view.hideToastActivity()
}
}
func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) {
showActivityIndicator(show: false)
self.view.hideToastActivity()
}
func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {
showActivityIndicator(show: false)
self.view.hideToastActivity()
}
func webView(webView: WKWebView, didFinishNavigation navigation: WKNavigation!) {
showActivityIndicator(show: false)
self.view.hideToastActivity()
}

how to open an external link from a webView in swift?

I have an app in swift and inside it I have a webview that calls my page, on my page I have a button to log in with google, backend firebsae, and the method I use is signInWithPopup and I want to open the popup but from safari
override func viewDidLoad() {
super.viewDidLoad()
let url = NSURL(string: "")
let request = NSURLRequest (url:url as! URL)
webView.load(request as URLRequest)
self.navigationController?.setNavigationBarHidden(true, animated: true)
self.locationManager.delegate = self
SVProgressHUD.show()
if Auth.auth().currentUser != nil {
SVProgressHUD.dismiss(withDelay: 0.5)
}else{
SVProgressHUD.dismiss()
}
estadoAutorizacion()
}
If you need to handle/open external links from safari, you need to implement
func webView(_ webView: WKWebView,
decidePolicyFor navigationAction: WKNavigationAction,
decisionHandler: #escaping (WKNavigationActionPolicy) -> Void)
Make your view controller confirm to WKNavigationDelegate and assign your controller to navigationDelegate property of webView

WKNavigationDelegate methods not called

I'm trying to write a controller with a webview and I need WKNavigationDelegate methods, the problem is that these methods are not being executed at all.
This is my controller:
import UIKit
import WebKit
public class WebViewController: UIViewController {
private let webView: WKWebView = WKWebView()
override public func viewDidLoad() {
super.viewDidLoad()
webView.navigationDelegate = self
webView.isUserInteractionEnabled = true
view = webView
}
}
extension WebViewController: WKNavigationDelegate {
private func webView(_ webView: WKWebView, didCommit navigation: WKNavigation!) {
debugPrint("didCommit")
}
private func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
debugPrint("didFinish")
}
private func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) {
debugPrint("didFail")
}
}
This controller is being added to a top view controller using a container view, also the webview loads the website correctly. Has anyone had a similar problem or knows if I'm doing something wrong
It looks like you are adding private with WKWebViewDelegate Methods, Remove those like this and it will work.
extension ViewController: WKNavigationDelegate {
func webView(_ webView: WKWebView, didCommit navigation: WKNavigation!) {
debugPrint("didCommit")
}
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
debugPrint("didFinish")
}
func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) {
debugPrint("didFail")
}
}
Try this out, Also don't forgot to load URL in WebView or whatever you want to load.

NavigationBar isn't appear when using WebViewKit

I've a ViewControllerWeb to show a WebView. I need nav bar to show some options to user, so I need that NavigationBar is showed.
Problem: The navigation bar is not showed.
ViewControllerWeb.swift
import UIKit
import WebKit
class ViewControllerWeb : UIViewController, WKNavigationDelegate {
#IBOutlet weak var webView: WKWebView!
#IBOutlet weak var progress: UIActivityIndicatorView!
var url : String?
override func viewDidLoad() {
self.webView.allowsBackForwardNavigationGestures = true
self.webView.navigationDelegate = self
let request = URLRequest(url: URL(string: url!)!)
self.navigationController?.navigationBar.isHidden = false
self.webView.load(request)
}
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
print("didFinish")
self.progress.stopAnimating()
}
func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) {
print("didiFail")
self.progress.stopAnimating()
}
func webViewWebContentProcessDidTerminate(_ webView: WKWebView) {
print("webViewWebContentProcessDidTerminate")
self.progress.stopAnimating()
}
func webView(_ webView: WKWebView,
didStartProvisionalNavigation navigation: WKNavigation!) {
print("didStartProvisionalNavigation")
self.progress.startAnimating()
}
func webView(_ webView: WKWebView,
didFailProvisionalNavigation navigation: WKNavigation!,
withError error: Error) {
print("didFailProvisional")
self.progress.stopAnimating()
}
}
Storyboard
Result on simulator iPhone7
The NavigationBar isn't showed.
Present ViewControllerWeb with UINavigationController.
// Storyboard name
let storyBoard:UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
// Storyboard withIdentifier
let viewController = storyBoard.instantiateViewController(withIdentifier: "ViewControllerWeb")
let navBarController = UINavigationController(rootViewController: viewController)
self.present(navBarController, animated: true, completion: nil)