WKWebView链接无法在轻触时打开

3
我正在开发一款应用程序,其中包含一些从其他开发人员继承的代码,其中有一个Web视图,可以加载HTML文件。
在HTML文件中,有电话号码和网页链接。如果长按电话号码,则电话号码将打开,但是HTML链接不会打开。
我希望它们可以通过短按打开,但是短按无反应。如果我长按,则系统对话框弹出,并显示“打开”选项,但是点击“打开”没有任何反应。
以下是我的代码:
#import "IntroductionViewController.h"

@interface IntroductionViewController () <WKNavigationDelegate, WKUIDelegate>

@end

@implementation IntroductionViewController

@synthesize html_file_name;
@synthesize web_view;
@synthesize spinner;

- (void)viewDidLoad {
[super viewDidLoad];

self.navigationController.navigationBarHidden = NO;

[self setTitle:_title_string];

[self.web_view bringSubviewToFront:spinner];
[spinner setHidden:NO];
[spinner startAnimating];

NSURL *url = [[NSBundle mainBundle] URLForResource:html_file_name withExtension:@"html"];
[self.web_view loadRequest:[NSURLRequest requestWithURL:url]];
self.web_view.navigationDelegate = self;
self.web_view.UIDelegate = self;
}

- (void)webView:(WKWebView *)webView didFailProvisionalNavigation:(null_unspecified WKNavigation *)navigation withError:(NSError *)error {
[spinner setHidden:YES];
[spinner stopAnimating];
}

- (void)webView:(WKWebView *)webView didFinishNavigation:(null_unspecified WKNavigation *)navigation {
[spinner setHidden:YES];
[spinner stopAnimating];
}

- (BOOL)webView:(WKWebView *)webView shouldStartLoadWithRequest (NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
NSLog(@"called here");
if (navigationType == UIWebViewNavigationTypeLinkClicked ) {
    UIApplication *application = [UIApplication sharedApplication];
    [application openURL:[request URL] options:@{} completionHandler:nil];
    return YES;
}
return YES;
}

@end

"

shouldStartLoadWithRequest"从未被调用。

"

请查看以下链接以了解有关编程的内容:https://stackoverflow.com/a/59391866/810466 - Tomer Even
3个回答

5

我成功地解决了这个问题,方法是删除代码中的"shouldStartLoadWithRequest"部分,并添加以下代码:

- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(nonnull WKNavigationAction *)navigationAction decisionHandler:(nonnull void (^)(WKNavigationActionPolicy))decisionHandler {
if (navigationAction.navigationType == WKNavigationTypeLinkActivated) {
    if (navigationAction.request.URL) {
        NSLog(@"%@", navigationAction.request.URL.host);
        if (![navigationAction.request.URL.resourceSpecifier containsString:@"ex path"]) {
            if ([[UIApplication sharedApplication] canOpenURL:navigationAction.request.URL]) {
                UIApplication *application = [UIApplication sharedApplication];
                [application openURL:navigationAction.request.URL options:@{} completionHandler:nil];
                decisionHandler(WKNavigationActionPolicyCancel);
            }
        } else {
            decisionHandler(WKNavigationActionPolicyAllow);
        }
    }
} else {
    decisionHandler(WKNavigationActionPolicyAllow);
}
}

现在所有的链接都会在一个新窗口中打开,对于网页链接,只需轻触一下即可。


1
在短按事件上开启长按事件,使用以下代码...
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: ((WKNavigationActionPolicy) -> Void)) {
        
        switch navigationAction.navigationType {
        case .linkActivated:
            UIApplication.shared.open(navigationAction.request.url!)
            decisionHandler(.cancel)
            return
        default:
            break
        }
        decisionHandler(.allow)
    }

我只是试图在1.5年后给自己的答案点赞... 请确保使用UIApplication.shared.open(navigationAction.request.url!)而不是UIApplication.shared.canOpenURL(navigationAction.request.url!)... - Wahab Khan Jadon

0

我已经从@r2d2的答案中将WKNavigationActionPolicy扩展到Swift,其中我重复了委托方法。

extension WKNavigationAction {
  
  var introLinkActionPolicy: WKNavigationActionPolicy {
    if let url = request.url, navigationType == .linkActivated && UIApplication.shared.canOpenURL(url) {
      UIApplication.shared.open(url)
      return .cancel
    }
    
    return .allow
  }
}

然后在代理方法 decidePolicyForNavigationAction : 中,我们可以返回

decisionHandler(navigationAction.introLinkActionPolicy)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接