WKWebview:禁用交互和点击链接

WKWebview: Disable interaction and clicks on links

有没有办法禁用 webview 上的交互? 这样用户就不能比加载的 webview 更进一步?

编辑: 禁用 UserInteractions 不是解决方案,因为网站仍然必须是可滚动的。

您可以按照下面的方式进行。

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

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

实施 WKNavigationDelegate 协议:

@interface ViewController () <WKNavigationDelegate>

设置你的 WKWebViewnavigationDelegate 属性:

self.wkWebView.navigationDelegate = self;

然后为您要限制的 URL(s) 实施政策:

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

这些 javascript 行将通过覆盖 HTML 禁用长按和 link 触摸。基于框架的内容(例如嵌入式 YouTube 视频)仍然有效。

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)'; }")
}

WKNavigationDelegate 解决方案仅阻止用户访问链接。我也有我想阻止交互的表单控件,同时仍允许滚动页面。最终我发现这可以通过禁用 web 视图的滚动视图的子视图来实现:

Swift

self.webView.scrollView.subviews.forEach { [=10=].isUserInteractionEnabled = false }

Objective-C

for (UIView *subview in self.webView.scrollView.subviews)
{
    subview.userInteractionEnabled = NO;
}

首先,您必须将委托提供给您的 webkit,然后添加以下代码。 Swift5.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)
}

这段代码将做什么,我们以编程方式添加 css 这将禁用 webview 中的交互