IOS使用WebView内嵌H5页面,使用a标签点击跳转无效问题解决

在使用WKWebView加载H5时,给文字添加超链接,使其可以点击跳转到某个地址。发现在 IOS 的app内,a标签点击跳转没有作用,无法跳转到正确地址,decidePolicyForNavigationAction也无法抓取到点击事件。但安卓是可以正常跳转。

iOS的用户长按链接也是可以打开链接的,不过是打开了个菜单,可以跳转到了浏览器。

WKWebView 加载完链接后点击内部链接无法跳转,是因为<a href = "xxx" target = "_black"> 中的target = "_black" 是打开新的页面,所以无法在当前页面打开,需要在当前页重新加载url。

a 超连接中target:

  • _blank -- 在新窗口中打开链接
  • _parent -- 在父窗体中打开链接
  • _self -- 在当前窗体打开链接,此为默认值
  • _top -- 在当前窗体打开链接,并替换当前的整个窗体(框架页)

解决方案01:

将a标签中的target="_blank"删除,或改为target="_self"

解决方案02:

给a标签添加点击事件,如:

html 复制代码
<a @click="jumpToUrl" target="_blank"  />

jumpToUrl(){
	window.location.href = this.url
}

解决方案03:

objectivec 复制代码
// WKWebView调用window.open(url, "_blank");没有反应的问题
- (WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(nonnull WKWebViewConfiguration *)configuration forNavigationAction:(nonnull WKNavigationAction *)navigationAction windowFeatures:(nonnull WKWindowFeatures *)windowFeatures {
    if (!navigationAction.targetFrame.isMainFrame) {
//        这里是直接跳转
//        [webView loadRequest:navigationAction.request];
		// 以下是去浏览器中打开URL
        NSURL *url = navigationAction.request.URL;
        if (url) {
            // iOS 10及以后版本使用此方法
            UIApplication *application = [UIApplication sharedApplication];
            [application openURL:url options:@{} completionHandler:^(BOOL success) {
                if (success) {
                    // URL成功打开
                    NSLog(@"URL opened successfully");
                } else {
                    // URL打开失败,可能是URL无效或应用没有权限
                    NSLog(@"Failed to open URL");
                }
            }];
        } else {
            // URL字符串无效
            NSLog(@"Invalid URL string");
        }
    }
    return nil;
}

解决方案04:

objectivec 复制代码
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler
{
    if (@available(iOS 11.0, *)) {
        WKHTTPCookieStore *cookieStore = webView.configuration.websiteDataStore.httpCookieStore;
        //get cookies
        //                [cookieStore getAllCookies:^(NSArray<NSHTTPCookie *> * _Nonnull cookies) {
        NSArray *cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies];
        for (id cookie in cookies) {
            [cookieStore setCookie:(NSHTTPCookie *)cookie completionHandler:nil];
        }
        //                }];
    } else {
        // Fallback on earlier versions
    }
    
    //如果是跳转一个新页面
    if (navigationAction.targetFrame == nil) {
//        这里是直接跳转
//        [webView loadRequest:navigationAction.request];
		// 以下是去浏览器中打开URL
        NSURL *url = navigationAction.request.URL;
        if (url) {
            // iOS 10及以后版本使用此方法
            UIApplication *application = [UIApplication sharedApplication];
            [application openURL:url options:@{} completionHandler:^(BOOL success) {
                if (success) {
                    // URL成功打开
                    NSLog(@"URL opened successfully");
                } else {
                    // URL打开失败,可能是URL无效或应用没有权限
                    NSLog(@"Failed to open URL");
                }
            }];
        } else {
            // URL字符串无效
            NSLog(@"Invalid URL string");
        }
    }
    decisionHandler(WKNavigationActionPolicyAllow);
}
相关推荐
周末也要写八哥4 小时前
html网页设计适合新手的学习路线总结
html
ZC跨境爬虫5 小时前
【爬虫实战对比】Requests vs Scrapy 笔趣阁小说爬虫,从单线程到高效并发的全方位升级
前端·爬虫·scrapy·html
爱上好庆祝5 小时前
svg图片
前端·css·学习·html·css3
阿捞212 小时前
Inertia.js 持久布局实现原理
前端·javascript·html
SY.ZHOU12 小时前
移动端架构体系(四):View层的组织与调用方案
flutter·ios·架构·系统架构·安卓
inxx15 小时前
iOS 26 模拟器启动卡死:Method Swizzling 在系统回调时触发 nil 崩溃
ios
Swift社区15 小时前
鸿蒙 vs iOS / Android:谁更适合 AI?
android·ios·harmonyos
你挚爱的强哥16 小时前
欺骗加载进度条,应用于无法监听接口数据传输进度的情况
前端·javascript·html
zhensherlock16 小时前
Protocol Launcher 系列:Mail Assistant 轻松发送 HTML 邮件
前端·javascript·typescript·node.js·html·github·js
亘元有量-流量变现16 小时前
ASO优化全流程实操指南:从基础到迭代,精准提升App曝光与转化
android·ios·harmonyos·aso优化·方糖试玩