首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

UIWebView迁移后WKWebView中显示的链接不起作用

UIWebView 是苹果公司早期提供的用于在 iOS 应用中嵌入网页内容的组件,但由于其性能和安全性问题,苹果在 iOS 8 中引入了 WKWebView 作为其替代品。WKWebView 提供了更好的性能和更多的功能,同时也带来了新的挑战,比如链接处理方式的差异。

基础概念

  • UIWebView: 是 iOS 中的一个老旧的网页视图控件,用于显示网页内容。
  • WKWebView: 是 iOS 8 及以后版本中推荐使用的网页视图控件,它基于 WebKit 引擎,提供了更好的性能和更多的定制选项。

迁移优势

  • 性能提升: WKWebView 比 UIWebView 更快,因为它使用了更现代的渲染引擎。
  • 内存管理: WKWebView 提供了更好的内存管理,减少了应用的内存占用。
  • 安全性: WKWebView 提供了更好的安全性,包括对跨站脚本攻击(XSS)的保护。
  • 功能丰富: 支持更多的 Web 标准和 API,如 IndexedDB、Service Workers 等。

类型与应用场景

  • 类型: WKWebView 主要有两种加载网页的方式,一种是通过 loadRequest(_:) 方法加载 URL 请求,另一种是通过 loadHTMLString(_:baseURL:) 方法加载 HTML 字符串。
  • 应用场景: 适用于需要在应用内嵌入网页的各种场景,如新闻阅读、社交分享、在线客服等。

遇到的问题及原因

在从 UIWebView 迁移到 WKWebView 后,可能会遇到链接不起作用的问题。这通常是由于 WKWebView 的安全策略和事件处理机制与 UIWebView 不同所导致的。

原因

  1. 安全策略: WKWebView 默认不允许页面内跳转,除非明确设置了允许。
  2. 事件处理: WKWebView 不会自动处理页面内的链接点击事件,需要手动设置代理并实现相应的方法。

解决方法

要解决这个问题,可以通过设置 WKWebView 的 navigationDelegate 并实现 webView(_:decidePolicyFor:decisionHandler:) 方法来允许页面内跳转。

代码语言:txt
复制
import WebKit

class ViewController: UIViewController, WKNavigationDelegate {
    
    var webView: WKWebView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let config = WKWebViewConfiguration()
        webView = WKWebView(frame: self.view.frame, configuration: config)
        webView.navigationDelegate = self
        self.view.addSubview(webView)
        
        if let url = URL(string: "https://example.com") {
            let request = URLRequest(url: url)
            webView.load(request)
        }
    }
    
    // MARK: - WKNavigationDelegate
    
    func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
        if let url = navigationAction.request.url {
            // 允许页面内跳转
            decisionHandler(.allow)
        } else {
            decisionHandler(.cancel)
        }
    }
}

在这个示例中,我们设置了 navigationDelegate 并实现了 decidePolicyFor 方法,该方法会在每次导航请求发生时被调用。通过这个方法,我们可以决定是否允许页面跳转。

总结

迁移 UIWebView 到 WKWebView 可以带来性能和安全性的提升,但也需要注意处理链接点击事件的方式。通过设置合适的代理方法,可以确保 WKWebView 中的链接能够正常工作。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

浅谈iOS中WKWebView和UIWebView的清除缓存问题

https://blog.csdn.net/u010105969/article/details/53943101 最近产品经理在验收项目,在验收过程中发现了一个问题:网页中的数据存在缓存。...网页中加载的是一张图片,在后台将加载的图片换掉的时候再在App中加载此网页,发现展示的图片还是之前的图片,并没有更新,而且多次重新加载网页显示的还是之前的图片,说明缓存很严重。...先说说UIWebView中缓存的清除,代码只有一句:  [[NSURLCachesharedURLCache]removeAllCachedResponses]; 再说WKWebView中缓存的清除...WKWebsiteDataStoredefaultDataStore]removeDataOfTypes:websiteDataTypesmodifiedSince:dateFromcompletionHandler:^{     }]; 其中types数组中的内容是可以选择的一些类型...注意:只有在iOS9之后WKWebView才有清除缓存的方法,在写代码的时候切记对系统版本进行判断。

5.3K10

Hybrid App 应用 开发中 9 个必备知识点复习(WebView 调试 等)

UIWebView WKWebView 与 UIWebView 的区别: WKWebView 的内存远远没有 UIWebView 的开销大,而且没有缓存; WKWebView 拥有高达 60FPS...库加载并使用, UIWebView 中限制了; WKWebView 目前缺少关于页码相关的 API; WKWebView 提供加载网页进度的属性; WKWebView 使用 Safari 相同的 JavaScript...js 的交互; 注意: 大多数App需要支持 iOS7 以上的版本,而 WKWebView 只在 iOS8 后才能用,所以需要一个兼容性方案,既 iOS7 下用 UIWebView ,iOS8 后用...WKWebView 页面样式问题 在 WKWebView 适配过程中,我们发现部分 H5 页面元素位置向下偏移或被拉伸变形,追踪后发现主要是 H5 页面高度值异常导致。...软件包(下载链接:DebugGap),下载完成后解压下来。

3.2K00
  • Hybrid App 应用开发中 9 个必备知识点复习

    WKWebView 与 UIWebView 的区别: WKWebView 的内存远远没有 UIWebView 的开销大,而且没有缓存; WKWebView 拥有高达 60FPS 滚动刷新率及内置手势...UIWebView 中限制了; WKWebView 目前缺少关于页码相关的 API; WKWebView 提供加载网页进度的属性; WKWebView 使用 Safari 相同的 JavaScript...js 的交互; 注意: 大多数App需要支持 iOS7 以上的版本,而 WKWebView 只在 iOS8 后才能用,所以需要一个兼容性方案,既 iOS7 下用 UIWebView , iOS8...WKWebView 页面样式问题 在 WKWebView 适配过程中,我们发现部分 H5 页面元素位置向下偏移或被拉伸变形,追踪后发现主要是 H5 页面高度值异常导致。...下载 DebugGap 并配置: 在电脑上面下载 Windows 版本的 DebugGap 软件包(下载链接:DebugGap),下载完成后解压下来。

    2.7K20

    Hybrid App 应用开发中 9 个必备知识点复习

    WKWebView 与 UIWebView 的区别: WKWebView 的内存远远没有 UIWebView 的开销大,而且没有缓存; WKWebView 拥有高达 60FPS 滚动刷新率及内置手势;...: 大多数App需要支持 iOS7 以上的版本,而 WKWebView 只在 iOS8 后才能用,所以需要一个兼容性方案,既 iOS7 下用 UIWebView , iOS8 后用 WKWebView...resetWKProcessPool 来触发 Cookie 同步到 NSHTTPCookieStorage 中,实践发现不起作用,并可能会引发当前页面 session cookie丢失等问题。...WKWebView 页面样式问题 在 WKWebView 适配过程中,我们发现部分 H5 页面元素位置向下偏移或被拉伸变形,追踪后发现主要是 H5 页面高度值异常导致。...下载 DebugGap 并配置: 在电脑上面下载 Windows 版本的 DebugGap 软件包(下载链接:DebugGap),下载完成后解压下来。

    2.3K30

    【Hybrid】288- Hybrid App 应用开发中 9 个必备知识点复习

    WKWebView 与 UIWebView 的区别: WKWebView 的内存远远没有 UIWebView 的开销大,而且没有缓存; WKWebView 拥有高达 60FPS 滚动刷新率及内置手势;...: 大多数App需要支持 iOS7 以上的版本,而 WKWebView 只在 iOS8 后才能用,所以需要一个兼容性方案,既 iOS7 下用 UIWebView , iOS8 后用 WKWebView...resetWKProcessPool 来触发 Cookie 同步到 NSHTTPCookieStorage 中,实践发现不起作用,并可能会引发当前页面 session cookie丢失等问题。...WKWebView 页面样式问题 在 WKWebView 适配过程中,我们发现部分 H5 页面元素位置向下偏移或被拉伸变形,追踪后发现主要是 H5 页面高度值异常导致。...下载 DebugGap 并配置: 在电脑上面下载 Windows 版本的 DebugGap 软件包(下载链接:DebugGap),下载完成后解压下来。

    2.3K20

    WKWebView 那些坑

    导语 WKWebView 是苹果在 WWDC 2014 上推出的新一代 webView 组件,用以替代 UIKit 中笨重难用、内存泄漏的 UIWebView。...简单的适配方法本文不再赘述,主要来说说适配 WKWebView 过程中填过的坑以及善待解决的技术难题。...工程师曾建议通过 reset WKProcessPool 来触发 Cookie 同步到 NSHTTPCookieStorage 中,实践发现不起作用,并可能会引发当前页面 session cookie...id=138169 (复制链接到浏览器中打开) 因此,如果通过 registerSchemeForCustomProtocol 注册了 http(s) scheme, 那么由 WKWebView 发起的所有...如果某些特殊情况下非得调整 contentInset 不可的话,可以通过下面方式让H5页面恢复正常显示: /**设置contentInset值后通过调整webView.frame让页面恢复正常显示

    4.7K130

    WKWebView

    在iOS中,加载网页目前有两种控件:UIWebView和WKWebView。...WKWebView的用法 ? WKWebView API WKWebView对象可以显示交互式Web内容,例如应用内浏览器。你可以使用WKWebView类将web内容嵌入到你的应用程序中。...默认情况下,Web视图会自动将出现在Web内容中的电话号码转换成电话链接。当电话链接被点击时,电话应用程序就会启动并拨打该号码。...布尔值,用于确定是否按下连接可以显示链接目标的预览。 - goBack。导航到后退列表中的后腿项中。 - goForward。导航到后退列表中的前进项中。...显示加载进度条 我们可以通过监听WKWebView的estimatedProgress属性值来实现一个加载进度条,而UIWebView只能是通过timer事件做一个假的加载进度条。

    6K20

    WKWebView 那些坑

    作者:林泽水 导语 WKWebView是苹果在WWDC 2014上推出的新一代webView组件,用以替代UIKit中笨重难用、内存泄漏的UIWebView, 拥有60fps滚动刷新率、和safari...来触发Cookie同步到NSHTTPCookieStorage中,实践发现不起作用,并可能会引发当前页面session cookie丢失等问题。...加载request3,最后将加载结果返回WKWebView; 5、WKWebView 页面样式问题 在WKWebView适配过程中,我们发现部分H5页面元素位置向下偏移或被拉伸变形,追踪后发现主要是H5...如果某些特殊情况下非得调整contentInset不可的话,可以通过下面方式让H5页面恢复正常显示: /*设置contentInset值后通过调整webView.frame让页面恢复正常显示 *参考...9、结语 本文总结了那些年和导师seanzhu一起填过的WKWebView的坑。虽然WKWebView坑比较多,但是相对UIWebView在内存消耗、稳定性方面还是有很大的优势。

    17.5K21

    【iOS开发】从 UIWebView 到 WKWebView

    ② UIWebView 和 WKWebView 的区别 WKWebView 更快(占用内存可能只有 UIWebView 的1/3~1/4),没有缓存,更为细致地拆分了 UIWebViewDelegate...③为什么现在是时候从 UIWebView 迁移到 WKWebView 了: 截止到我写这篇文章的时候,据 mixpanel 的数据,iOS 9 占有率已达 58.55%,iOS 8 占有率达到了 34.78%...WKWebView 是 iOS 8 之后才有的 WebKit 中的内容,所以之前我们要同时兼容 iOS 7 和 iOS 8 的时候,可以推辞说 UIWebView 和 WKWebView 一起做太麻烦了...正文 常用代理方法 在 WKWebView 中,UIWebViewDelegate 与 UIWebView 被重构成了14类与3个协议,下面给出一些在 UIWebView 中常用的方法的 WKWebView..., forMainFrameOnly: true) // 这里的 AtDocumentEnd 字段是指网页中的内容加载完毕后再插入 JS 脚本,你也可以选择 AtDocumentStart,在 document

    1.8K20

    Flutter 与 iOS 原生 WebView 对比

    > UIWebView > flutter_webview 占用内存对比 这里查看内存使用的是 Xcode 的 debug session 中的 memory,首先看之前测试时,连续打开十次新浪的内存情况...结论:内存 WKWebView > flutter_webview > UIWebView HTML5 兼容性对比 可以在 html5test 中对浏览器的兼容性进行评分,通过测试发现得分分别如下: 因为...flutter 里使用的就是 WK,所以和原生的 WKWebView 一样都是 444 分,比 UIWebView 的 437 略胜一筹。...是比UIWebView更好的选择,推荐使用; flutter_webView_plugin:在iOS中使用的就是原生的WKWebView,所以总体和 native WKWebView 表现差不多。...不过如果从多端考虑、以及项目可迁移等,那么使用也未尝不可,就是维护成本要增加一些,需要维护两套 webView。这个就需要根据自己的情况自己取舍了。

    1.6K20

    iOS小技能:UIWebView 被拒的解决方案(用更安全的WKWebView替代UIWebView)

    引言 背景:202012之后苹果将不接受使用UIWebView UIWebView 被拒的解决方案:使用WKWebView替代UIWebView 1、查 SDK是否用 UIWebView 的 API...2、移除/升级含UIWebView的第三方SDK(例:AFNetworking) 3、使用WKWebView替代UIWebView 4、WKWebView与JS交互案例(点击页面图片,调用iOS方法进行图片放大显示...、NSURLSession 和 UIWebView 中的请求; 对于 WKWebView 中发出的网络请求也无能为力,如果真的要拦截来自 WKWebView 中的请求,还是需要实现 WKWebView...对应的 WKNavigationDelegate,并在代理方法中获取请求。...1.2 移除/替换自己项目使用UIWebView API的代码 自己是否用了该 API 只需要在 Xcode 中全局搜索即可 II 升级包含UIWebView的第三方SDK的具体例子 pod

    3.3K20

    WKWebView 白屏问题

    1、WKWebView 自诩拥有更快的加载速度,更低的内存占用,但实际上 WKWebView 是一个多进程组件,Network Loading 以及 UI Rendering 在其它进程中执行。...初次适配 WKWebView 的时候,我们也惊讶于打开 WKWebView 后,App 进程内存消耗反而大幅下降,但是仔细观察会发现,Other Process 的内存占用会增加。...在一些用 webGL 渲染的复杂页面,使用 WKWebView 总体的内存占用(App Process Memory + Other Process Memory)不见得比 UIWebView 少很多。...在 UIWebView 上当内存占用太大的时候,App Process 会 crash;而在 WKWebView 上当总体的内存占用比较大的时候,WebContent Process 会 crash,从而出现白屏现象...综合以上两种方法可以解决绝大多数的白屏问题。 参考链接:腾讯Bugly

    4.5K20

    iOS开发----JavaScriptCore、UIWebView及WKWebView交互的那些事

    ,并分别结合 UIWebView以及 WKWebView做了一下交互总结。...假设一个简单的场景 Web通过一个 输入一个字符串,通过点击按钮设置成导航标题 原生设置完导航标题后,告知Web"以将"设置成导航Title,并在网页最底下的label显示出来...分别使用 UIWebView 以及 WKWebView 实现效果如下: JavaScriptCore 类库里面有12个类(还有两个是负责导入相关类的头文件以及一个关于WebKit的宏定义);在基本的交互过程中...JavaScript中的逻辑如下: 确认当前使用的是 UIWebView还是 WKWebView,并通过变量 ritl_type确定 点击按钮,根据类型执行不同的操作 客户端通过执行 iosTellSomething...这样子,基于JavaScriptCore的UIWebView以及WKWebView交互就算圆满完成啦!

    1.6K20

    iOS监听H5页面goBack返回事件 & 网页监听APP返回键 (NavigationBackItemInjection)

    1.1 UIWebView 监听H5页面goBack返回事件 1.2 WKWebView监听H5页面goBack返回事件 2.1 原理 2.2 例子 什么时候会触发这个返回事件?...截取当前显示在屏幕中的WKWebView UINavigationBarDelegate NavigationType Disable all the '_blank' target in page's...target 在WKWebView的WKNavigationDelegate代理方法中处理应用跳转 简单的处理WKWebView加载新页面 WKWebView显示JS弹框 WKWebView调用js方法...2、canGoBack:判断当前H5界面是否可以返回的方法 3、goBack: 返回上一个界面 4、goForward:可以向前导航到back-forward列表中的内容,相当于回到关闭的之前看过的详情界面...5、 _webView.allowsBackForwardNavigationGestures = YES;允许左滑右滑,默认值为NO;设置为YES后,即可实现左右滑手势操作后退前进 6、WKWebView

    6.1K21

    动态链接后ELF中的Section Name

    背景 在So动态链接后,读取ELF文件,发现无法读取Section Header中的名称列表。即,无法在EShdr中根据e_shstrndx找到Section对应的名字。...而在运行时候的动态链接是根据Segment来加载So中的文件,原因是希望尽可能小的使用内存页面,并且提升加载速度。 ?...ELF链接与执行时视图 于是查看程序头部分,发现LOAD类型的段中,仅仅只有.dynstr这个字符串表会被加载到内存中。 ?...shstrtab 结论 shstrtab与strtab这两个表仅仅只是链接后保存在So文件中的,而在链接之后的执行视图层面,这两个字符串表不会被加载到内存中。...并且,在执行视图中,可能没有SHDR,所以在链接完的文件中可以根据SHDR中的偏移量来找到对应的名字,而在加载到内存之后的执行视图中,不能按照SHDR来查找Section的名字了。

    1.3K30
    领券