10

Is there a way to disable interactions on a webview? So that the user can not go any further than the webview that is loaded?

EDIT: Disabling UserInteractions is not a solution because the website still has to be scrollable.

Secondwave
  • 225
  • 1
  • 4
  • 17

5 Answers5

9

Implement the WKNavigationDelegate protocol:

@interface ViewController () <WKNavigationDelegate>

Set your WKWebView's navigationDelegate property:

self.wkWebView.navigationDelegate = self;

Then implement the policy for the URL(s) that you want to restrict:

- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {

    if ([navigationAction.request.URL.absoluteString containsString:@"somedomain.com/url/here"]) {
        decisionHandler(WKNavigationActionPolicyAllow);
    }
    else {
        decisionHandler(WKNavigationActionPolicyCancel);
    }
}
Vinny Coyne
  • 2,365
  • 15
  • 24
  • The problem here is when i got a url like google.com i.e and it should not open google.com/"something" it does not work with containsString but i can not diasable userInteractions because of scrolling. – Secondwave Apr 12 '17 at 11:30
  • You can use isEqualToString or some other comparison in that case. – Vinny Coyne Apr 12 '17 at 11:45
8

The WKNavigationDelegate solution only prevents the user from following links. I also have form controls that I want to prevent interaction with, while still allowing the page to be scrolled. Eventually I figured out that this could be achieved by disabling the subviews of the web view's scroll view:

Swift

self.webView.scrollView.subviews.forEach { $0.isUserInteractionEnabled = false }

Objective-C

for (UIView *subview in self.webView.scrollView.subviews)
{
    subview.userInteractionEnabled = NO;
}
Dan Dyer
  • 53,737
  • 19
  • 129
  • 165
  • VinneyCoyne's answer still allows the display of menu.. but prevents interaction with it. But this answer is perfect. No interaction except scrolling of the webview, which is what i want. Thanks! – anoo_radha Nov 26 '19 at 21:19
  • I'm facing this error `Value of type 'WKWebView' has no member 'scrollView'` – Krunal Nagvadia Dec 28 '20 at 05:52
  • @KrunalNagvadia That's odd, it's a publicly accessible field of that class (see https://developer.apple.com/documentation/webkit/wkwebview/1614784-scrollview). I assume you haven't inadvertently defined another type called `WKWebView`? Maybe it's some Xcode problem that can be fixed with a restart? – Dan Dyer Dec 29 '20 at 14:58
3

First, you have to give the delegate to your webkit then add below code. Swift 5.0

func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
    Activity.stopAnimating()
    let javascriptStyle = "var css = '*{-webkit-touch-callout:none;-webkit-user-select:none}'; var head = document.head || document.getElementsByTagName('head')[0]; var style = document.createElement('style'); style.type = 'text/css'; style.appendChild(document.createTextNode(css)); head.appendChild(style);"
    webView.evaluateJavaScript(javascriptStyle, completionHandler: nil)
}

What this code will do, we add programmatically css that will disable interaction in webview

1

These javascript lines will disable long presses and link touches by overriding the HTML. Frame based things like embedded youtube videos will still work.

func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
    webView.evaluateJavaScript("document.documentElement.style.webkitUserSelect='none'")
    webView.evaluateJavaScript("document.documentElement.style.webkitTouchCallout='none'")
    webView.evaluateJavaScript("var elems = document.getElementsByTagName('a'); for (var i = 0; i < elems.length; i++) { elems[i]['href'] = 'javascript:(void)'; }")
}
Bruno Rocha
  • 998
  • 8
  • 13
-3

You can do it as follow.

//-----------------------------------------------------------------------

#pragma mark - UIWebView Methods

//-----------------------------------------------------------------------

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {



    return YES;
}

//----------------------------------------------------------------

- (void)webViewDidStartLoad:(UIWebView *)webView {
//disable user interaction 
}

//----------------------------------------------------------------

- (void)webViewDidFinishLoad:(UIWebView *)webView{
//enable user interaction
}

//----------------------------------------------------------------

- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error{
    //enable user interaction
}
Mahendra
  • 8,448
  • 3
  • 33
  • 56