how to open an external link from a webView in swift? - 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

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.

How to open urls with target="blank" in safari (WKWebView, webkit)

I'm developing an app that is basically a Web View displaying a website designed to mimic an app. The majority of URLs will be internal however there will be a few which will redirect to other sites. All these links will have target="_blank".
I've spent days browsing this site and others to find a solution that will open _blank URLs in safari however everything I've tried has failed.
Any help with this would be much appreciated. I've added below the code from my View Controller
import UIKit
import WebKit
class ViewController: UIViewController, WKUIDelegate, WKNavigationDelegate {
#IBOutlet weak var webView:WKWebView!
override func viewDidLoad() {
super.viewDidLoad()
webView.uiDelegate = self
let myURL = URL(string:"https://example.com")
let myRequest = URLRequest(url: myURL!)
webView?.load(myRequest)
}}
func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? {
if let frame = navigationAction.targetFrame,
frame.isMainFrame {
return nil
}
webView.load(navigationAction.request)
return nil
}
replace your createWebViewWith with this one
extension ViewController: WKUIDelegate {
//This opens maps or any other url given in new tab
func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? {
if navigationAction.targetFrame == nil {
webView.load(navigationAction.request)
}
return nil
}
}

PDF not downloading in WKWebView

I'm using WKWebView to create a browser instance of my Angular webapp. In this webapp I use jspdf to generate and download PDF files. When trying to download this file, I get no feedback in the console but nothing is happening. Does anyone have a solution for this problem? This is my code:
import UIKit
import WebKit
class ViewController: UIViewController, WKUIDelegate {
#IBOutlet var mWebKit: WKWebView!
let url = URL(string: "foo.bar")
override func viewDidLoad() {
super.viewDidLoad()
let request = URLRequest(url: url!)
mWebKit.load(request)
}
}
Allow mWebKit to load pdf files. By default the wkWebView cancels the urls containing pdfs.
override func viewDidLoad() {
super.viewDidLoad()
mWebKit.uiDelegate = self // set the delegate to call decidePolicyfor.
let request = URLRequest(url: url!)
mWebKit.load(request)
}
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: #escaping (WKNavigationActionPolicy) -> Void) {
decisionHandler(.allow)
}

Issue with programmatically adding ActivityIndicator with WKWebView, not appearing

My code successfully loads the web page that I want it to; however, I'm having issues adding my activity indicator for while it is loading.
I am relatively new to swift, so I was reading other stackexchange examples. I created a UIActivityIndicator, set it in the override func, but it doesn't show up.
The webpage loads fine. Here is the runnable code.
import UIKit
import WebKit
class FeedbackWebViewController: UIViewController, WKNavigationDelegate {
let indicator = UIActivityIndicatorView(style: .gray)
var webView: WKWebView!
override func loadView() {
webView = WKWebView()
webView.navigationDelegate = self
indicator.center = webView.center
indicator.hidesWhenStopped = true
webView.addSubview(indicator)
view = webView
}
override func viewDidLoad() {
super.viewDidLoad()
let url = URL(string: "https://www.apple.com")!
webView.load(URLRequest(url: url))
webView.allowsBackForwardNavigationGestures = true
self.indicator.startAnimating()
}
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
indicator.stopAnimating()
}
func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) {
indicator.stopAnimating()
}
}
DONT override loadView. bad things may happen.
move code in didLoad. it should work.
try to put the related 3 lines to viewDidAppear rather than viewDidLoad. It works for me.

Swift ShouldStartLoadWith not working when detect url

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