我想在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和断点来测试它。
答案 0 :(得分:1)
由于我无法想出更聪明的东西,我用javascript做了。
基本上,你加载js文件,查找容器和链接,并为你想要的链接设置href="javascript:(void)"
。
答案 1 :(得分: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)
}
答案 2 :(得分:0)
尝试:
func webView(_ webView: WKWebView, decidePolicyFor navigationResponse: WKNavigationResponse, decisionHandler: @escaping (WKNavigationResponsePolicy) -> Void)
{
decisionHandler(navigationResponse.response.url?.absoluteString == mainLink ? .allow : .cancel)
}
答案 3 :(得分:0)
我遇到了一种完全禁用包括JavaScript在内的链接的解决方案。
我已使用WKWebview代替UIWebview来实现此目的。
创建一个BOOL变量,并在视图加载后将其设置为“是”。
allowLoad = YES;
将此下面的代码放在您要加载网址的位置以禁用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);
}}
现在在此代码之后,您将无法在打开的页面上打开任何链接。
答案 4 :(得分:0)
您可以使用以下代码。但是它将从整体上禁用用户与webView的交互。在Swift 4中:
webView.isUserInteractionEnabled = false