【问题标题】:Disable links in WKWebView?禁用 WKWebView 中的链接?
【发布时间】:2016-08-27 13:43:29
【问题描述】:

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


尝试使用 webView:decidePolicyForNavigationAction:decisionHandler: 但新页面在调用之前已加载,并且如果我使用 navigationAction.request.URL 则不会出现相关链接。还尝试了UIDelegate,但根本没有加载。


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



编辑:

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

当用户按下链接时,我想停止 WKWebView 打开它,而是将该链接保存到数组中。如果满足某些条件,也许可以使用 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; 来检测和禁用外部链接。但这显然对我不起作用。我刚刚添加了 NSLog 和断点来测试它。

【问题讨论】:

  • 你试过webView.allowsLinkPreview = false吗?
  • 试过了。但默认值为假。如果是真的,按住可以工作,但我想完全禁用它并在满足某些条件时手动打开它。
  • 显示您的识别码
  • 恐怕你会误用webView:decidePolicyForNavigationAction:decisionHandler:。请显示您尝试过的代码。

标签: ios objective-c swift wkwebview


【解决方案1】:
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)
}

【讨论】:

  • 使用一些javascript,链接可能会保持.other的类型,这意味着navigationType非常不可靠。
  • 还有什么需要补充的吗?当我单击 MKWebView 中的链接时,不会调用此函数。
  • 当用户点击侧面板菜单等时,它仍然会退回到允许情况。
【解决方案2】:

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

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

【讨论】:

  • 你是怎么用这个的?你能举个例子解释一下吗?
【解决方案3】:

试试:

func webView(_ webView: WKWebView, decidePolicyFor navigationResponse: WKNavigationResponse, decisionHandler: @escaping (WKNavigationResponsePolicy) -> Void)
{
    decisionHandler(navigationResponse.response.url?.absoluteString == mainLink ? .allow : .cancel)
}

【讨论】:

    【解决方案4】:

    我遇到了一种完全禁用包括 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 添加所需的委托方法以禁用链接 -

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

    现在,在此代码之后,您将无法打开已打开页面上的任何链接。

    【讨论】:

      【解决方案5】:

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

      webView.isUserInteractionEnabled = false 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多