禁用 WKWebView 中的链接?

Disable links in WKWebView?

我想在 WKWebView 中加载页面,然后禁用其中的 links。大多数 link 都是相对的。


尝试使用 webView:decidePolicyForNavigationAction:decisionHandler: 但新页面在调用之前加载,如果我使用 navigationAction.request.URL 则不会出现相对 links 。还尝试使用 UIDelegate,但根本无法加载。


有任何想法吗? Obj C 是可取的,但 Swift 也可以。



编辑:

好的,我稍微改一下问题。

当用户按下 link 时,我想停止 WKWebView 打开它,而是将 link 保存到数组中。如果满足某些条件,可以使用 loadrequest 手动打开它。

代码简单

- (void)viewDidLoad {
    [super viewDidLoad];

    NSString *sURL = @"https://www.mytestingwebsite.com";
    NSURL *URL = [NSURL URLWithString:sURL];

    WKWebViewConfiguration *theConfiguration = [[WKWebViewConfiguration alloc] init];
    [self addUserScriptsToUserContentController:theConfiguration.userContentController];

    WKWebView *webView = [[WKWebView alloc] initWithFrame:self.view.frame configuration:theConfiguration];
    webView.navigationDelegate = self;
    webView.UIDelegate = self;
    //webView.allowsLinkPreview = TRUE;

    NSURLRequest *nsrequest=[NSURLRequest requestWithURL:URL];
    [webView loadRequest:nsrequest];
    [self.view addSubview:webView];
}


他们在 WWDC 2014 视频 206 NSURL *selectedURL = navigationAction.request.URL; 中使用来检测和禁用外部 link。但这显然对我不起作用。我刚刚添加了 NSLog 和断点来测试它。

因为我想不出更聪明的东西,所以我用 javascript 做了。

基本上,您加载 js 文件,查找容器和链接,然后为您想要的链接设置 href="javascript:(void)"

尝试:

func webView(_ webView: WKWebView, decidePolicyFor navigationResponse: WKNavigationResponse, decisionHandler: @escaping (WKNavigationResponsePolicy) -> Void)
{
    decisionHandler(navigationResponse.response.url?.absoluteString == mainLink ? .allow : .cancel)
}
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Swift.Void) {
    guard navigationAction.navigationType == .other || navigationAction.navigationType == .reload  else {
        decisionHandler(.cancel)
        return
    }
    decisionHandler(.allow)
}

我遇到了一种完全禁用 link 的解决方案,包括 JavaScript。

我已经使用 WKWebview 代替 UIWebview 来实现这个。

创建一个 BOOL 变量并在加载视图中将其设置为 YES。

allowLoad = YES;

将此代码放在您正在加载的地方 URL 以禁用 Java 脚本。

WKPreferences *preferences = [[WKPreferences alloc] init];
preferences.javaScriptEnabled = NO;
WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc] init];
configuration.preferences = preferences;
self.webView =[[WKWebView alloc] initWithFrame:CGRectMake(0.0, 0.0, self.view.frame.size.width, self.view.frame.size.height) configuration:configuration];
self.webView.navigationDelegate = self;
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"Your URL that you want to lead"]];
[self.webView loadRequest:request];

现在为 WKNavigationDelegate 添加必需的委托方法以禁用 link -

- (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation {
[MBProgressHUD showHUDWithText:SyLocalizedString(@"Loading", @"L10N comment TBD") addedTo:self.view];}

- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation {
[MBProgressHUD hideAllProgressHUDsForView:self.view animated:YES];
allowLoad = NO;}

- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {
if (allowLoad == YES) {
    decisionHandler(WKNavigationActionPolicyAllow);
} else {
    decisionHandler(WKNavigationActionPolicyCancel);
}}

现在输入此代码后,您将无法在打开的页面上打开任何 link。

您可以使用以下代码。但它会禁用整个 webView 的用户交互。在 Swift 4:

webView.isUserInteractionEnabled = false