In a WKWebView, every time I tap on a URL, the navigationType is .other. When does navigationType equal .linkActivated?
Very unlikely. Maybe you are interpreting the raw values wrong?
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: #escaping (WKNavigationActionPolicy) -> Void) {
print(navigationAction.navigationType.rawValue)
// -1 "other" seen when assigning the url programatically
// 0 "linkActivated" a link with an href attribute was tapped
// 3 "reload" page was refreshed
}
See the docs where you can click on the enumerations listed and and see their raw values
Related
For example, I write as follows, then it works correctly, that is, the content that comes is displayed as it should and when the user clicks the link, it doesn't redirect anywhere.
extension AuthorizationContentView: WKNavigationDelegate {
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: #escaping (WKNavigationActionPolicy) -> Void) {
if navigationAction.navigationType == .linkActivated {
decisionHandler(.cancel)
} else {
decisionHandler(.allow)
}
}
}
BUT I need to cover all the cases of clicking on the link and not just linkActivated(A link with an href attribute was activated by the user), but if I write just decisionHandler(.cancel), then the content is not displayed and it is unclear why so.
extension AuthorizationContentView: WKNavigationDelegate {
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: #escaping (WKNavigationActionPolicy) -> Void) {
decisionHandler(.cancel)
return
}
}
UPD:
func setupWebView(content: String) {
let supportDarkCSS = "<style>:root { color-scheme: light dark; }</style>"
contentStackView.removeAllArrangedSubviews()
webView.loadHTMLString(content + supportDarkCSS, baseURL: nil)
contentStackView.addArrangedSubview(webView)
}
Ok, so after I understand what you are trying to do, the .linkActivated navigation type does not include all of the cases you are trying to block.
I think the best options is to keep intercept the requests using the func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: #escaping (WKNavigationActionPolicy) -> Void) delegate function.
You can use the URLRequest property on the WKNavigationActioni.e navigationAction.request.
Then you can use the URLRequest metadata, for example, the URL itself (navigationAction.request.url) or the HTTP method, and understand if that request needs to be blocked.
cy) -> Void) {
attempts to
navigationAction.request
setValue("Cookies": ...
in
public func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: #escaping (WKNavigationActionPoli
has no effect
(setCookie likewise has no effect on that webview configuration)
Any ideas? ios 12 and 13
I have posted the delegate method I used if there is no event for button action how can I add that event with javascript .how can I use the functionalists in my view controller.
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: #escaping (WKNavigationActionPolicy) -> Void) {
print(#function)
guard let url = navigationAction.request.url else {
decisionHandler(.allow)
return
}
if url.absoluteString.contains("ios-development-course") {
// this means login successful
decisionHandler(.cancel)
}
else {
decisionHandler(.allow)
}
}
When you click a button which is basically a link in web view, the navigation happens in web view.
There is a delegate method you can use to allow or cancel that navigation.
public func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: #escaping (WKNavigationActionPolicy) -> Void) {
var shouldLoad = true
if navigationAction.navigationType == .linkActivated.
//user clicked button on web view
decisionHandler(shouldLoad ? .allow : .cancel)
}
}
I make request with my data. I want to get token from Instagram API. When I paste my url in browser, I see token. But I need to get it programmatically. How can I do it?
webView.load(URLRequest(url: url))
You just want to read the token from the header? You could try this. Set:
webView.navigationDelegate = self
And then in the WKNavigationDelegate method:
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: #escaping (WKNavigationActionPolicy) -> Void) {
print(navigationAction.request.allHTTPHeaderFields)
}
From my understanding and trying out some code, we can only monitor page navigation requests using
func webView(_ webView: WKWebView, decidePolicyFor navigationResponse: WKNavigationResponse, decisionHandler: #escaping (WKNavigationResponsePolicy) -> Void)
{
if // some condition
{
decisionHandler(.allow) // to allow the page navigation.
}
else
{
decisionHandler(.cancel) // to cancel the page navigation.
}
}
But is there any way to monitor and block some ajax requests in WKWebView?
And also to capture the ajax response.