监听 web 容器内的网络请求(错误的方案)

需求

iOS 项目中 wkwebview 实现的 web 容器,需要监听 web 容器内的所有网络请求

实现

在 iOS 项目中使用 WKWebView 实现的 Web 容器,监听 Web 容器内的网络请求是一个常见需求。可以通过实现 WKURLSchemeHandler 协议来处理自定义的 URL scheme,从而拦截和监听网络请求。以下是一个优秀的实现方案:

实现步骤

  1. 创建自定义 URL Scheme Handler

首先,创建一个新的类实现 WKURLSchemeHandler 协议,例如 CustomURLSchemeHandler

import WebKitclass CustomURLSchemeHandler: NSObject, WKURLSchemeHandler {func webView(_ webView: WKWebView, start urlSchemeTask: WKURLSchemeTask) {let url = urlSchemeTask.request.url!// 打印或处理请求print("Request URL: \(url.absoluteString)")// 这里可以进行自定义处理,如加载本地资源或转发请求// 示例:直接返回一个空白页面let response = HTTPURLResponse(url: url, statusCode: 200, httpVersion: nil, headerFields: nil)!let data = Data()urlSchemeTask.didReceive(response)urlSchemeTask.didReceive(data)urlSchemeTask.didFinish()}func webView(_ webView: WKWebView, stop urlSchemeTask: WKURLSchemeTask) {// 处理请求取消逻辑}
}
  1. 配置 WKWebViewConfiguration 并注册自定义 Scheme Handler

创建并配置 WKWebViewConfiguration,然后注册自定义的 URL Scheme Handler:

let config = WKWebViewConfiguration()
let schemeHandler = CustomURLSchemeHandler()
config.setURLSchemeHandler(schemeHandler, forURLScheme: "https")let webView = WKWebView(frame: .zero, configuration: config)
  1. 加载 Web 内容

最后,使用 WKWebView 加载需要的 Web 内容:

let request = URLRequest(url: URL(string: "https://example.com")!)
webView.load(request)

完整示例代码

以下是完整的实现代码:

import UIKit
import WebKitclass ViewController: UIViewController {var webView: WKWebView!override func viewDidLoad() {super.viewDidLoad()let config = WKWebViewConfiguration()let schemeHandler = CustomURLSchemeHandler()config.setURLSchemeHandler(schemeHandler, forURLScheme: "https")webView = WKWebView(frame: self.view.bounds, configuration: config)self.view.addSubview(webView)let request = URLRequest(url: URL(string: "https://example.com")!)webView.load(request)}
}class CustomURLSchemeHandler: NSObject, WKURLSchemeHandler {func webView(_ webView: WKWebView, start urlSchemeTask: WKURLSchemeTask) {let url = urlSchemeTask.request.url!print("Request URL: \(url.absoluteString)")// 这里可以进行自定义处理,如加载本地资源或转发请求// 示例:直接返回一个空白页面let response = HTTPURLResponse(url: url, statusCode: 200, httpVersion: nil, headerFields: nil)!let data = Data()urlSchemeTask.didReceive(response)urlSchemeTask.didReceive(data)urlSchemeTask.didFinish()}func webView(_ webView: WKWebView, stop urlSchemeTask: WKURLSchemeTask) {// 处理请求取消逻辑}
}

总结

通过实现 WKURLSchemeHandler 并注册自定义的 URL scheme,可以轻松监听并处理 WKWebView 内的所有网络请求。这种方法不仅可以用于调试和日志记录,还可以实现高级的请求拦截和处理逻辑。


更新:这是一个错误的方案

上面的代码有一个问题:WKWebViewsetURLSchemeHandler(_:forURLScheme:) 方法不允许处理 httpshttp URL scheme。这是因为这些 URL schemes 是由系统处理的,不能被自定义的 scheme handler 覆盖。

这里是修正的代码示例,使用一个自定义的 URL scheme,例如 customscheme

import WebKitclass CustomURLSchemeHandler: NSObject, WKURLSchemeHandler {func webView(_ webView: WKWebView, start urlSchemeTask: WKURLSchemeTask) {// 自定义处理 URL 请求的逻辑}func webView(_ webView: WKWebView, stop urlSchemeTask: WKURLSchemeTask) {// 自定义停止处理 URL 请求的逻辑}
}let config = WKWebViewConfiguration()
let schemeHandler = CustomURLSchemeHandler()
config.setURLSchemeHandler(schemeHandler, forURLScheme: "customscheme")let webView = WKWebView(frame: .zero, configuration: config)// 测试加载自定义 scheme 的 URL
if let url = URL(string: "customscheme://example") {let request = URLRequest(url: url)webView.load(request)
}

在这个示例中,我们使用了一个自定义的 URL scheme (customscheme),并创建了一个自定义的 WKURLSchemeHandler 来处理这个 scheme 的 URL 请求。这样就避免了覆盖系统处理的 httpshttp URL schemes 的问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/40627.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

通过 API 接口管理 Kafka

文章目录 前言Topic 管理配置管理消费者群组管理查看消费者群组修改消费者群组 为主题添加分区从主题中删除消息首领选举 前言 除了通过命令行和可视化界面对 kafka 进行管理,也可以通过 AdminClient的 API 对 kafka 进行管理。本文将介绍如何通过 AdminClient 进行…

[Vue学习]生命周期及其各阶段举例

当我们运行vue项目,看到了屏幕上显示的界面,看到了界面上显示的数据和标签,之后将这个界面叉掉,这一过程其实经历了一整个vue的生命周期的四个阶段,即创建阶段、挂载阶段、更新阶段以及销毁阶段, 而对于每个阶段的启动…

使用 pyecharts 渲染成图片程序报错: echarts is not defined问题处理

背景 之前写的使用 snapshot_selenium 来保存pyeacharts渲染成的网页截图,可以正常运行。程序搁置了半年,不知道动了电脑哪里,再次运行程序时,程序开始报错:JavascriptException: javascript error: echarts is not d…

【SQL】已解决:SQL分组去重并合并相同数据

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决:SQL分组去重并合并相同数据 在数据库操作中,数据的分组、去重以及合并是常见需求。然而,初学者在编写SQL语句时,可能会遇到一…

正弦波与单位圆关系的可视化 包括源码

正弦波与单位圆关系的可视化 包括源码 flyfish 正弦波与单位圆的关系 正弦波可以通过单位圆上的点在直线(通常是 y 轴)上的投影来表示。具体来说,考虑一个单位圆,其半径为 1,圆心在原点。我们可以通过旋转一个角度 …

每日一道算法题 判断子序列

题目 判断子序列_牛客题霸_牛客网 (nowcoder.com) Python # # 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 # # # param S string字符串 # param T string字符串 # return bool布尔型 # class Solution:def isSubseq…

【全网最全流程+所有代码】企业微信回调联调,开通企微回调和收到企微回调

流程图: 只是这里的消息回调,仅作为提示,群内有消息了。不是具体的消息,而是类似这样的结构,: 如果需要获取消息,还需要拉取企微群内消息方法,这个后续再更新。 好了,我们开始吧。 开启消息回调和接收消息回调,地址是一样的,只是 开启消息回调,get请求, 接受消…

人工智能在日常生活中的十大应用:从医疗到智能家居

人工智能已成为当今人类日常生活的重要组成部分,无论您是否意识到,它几乎在所有场景中都能提供帮助。每次您进行网络搜索、在线预订旅行、接收来自京东等购物平台的产品推荐又或是打开您的新浪、抖音时,都能看到影子,这些只是一些…

代码随想录算法训练营第51天 [115.不同的子序列 583. 两个字符串的删除操作 72. 编辑距离 ]

代码随想录算法训练营第51天 [115.不同的子序列 583. 两个字符串的删除操作 72. 编辑距离 ] 一、115.不同的子序列 链接: 代码随想录. 思路:dp[i][j] 以t[j-1]为结尾的字符串在 以s[i-1]为结尾的字 符串出现个数 相等的时候 dp[i][j] dp[i - 1][j - 1] dp[i - 1][…

JAVA案例模拟电影信息系统

一案例要求: 二具体代码(需要在同一个包下创建三个类) Ⅰ:实现类 package 重修;import java.util.Random; import java.util.Scanner;public class first {public static void main(String[] args) {javabean[]moviesnew javabean[4];movies[0] new ja…

加密与安全_ Jasypt (Java Simplified Encryption)不完全指北

文章目录 官网功能概述Code附 官网 http://www.jasypt.org/ 功能概述 Jasypt 是一个 Java 库,它允许开发人员以最小的努力添加基本的加密功能,并且不需要深入了解密码学的工作原理。 高安全性、基于标准的加密技术,适用于单向和双向加密。…

AIGC对设计师积极性的影响

随着科技的迅猛发展,生成式人工智能(AIGC)工具正逐渐深入设计的每个角落,对设计师的工作方式和思维模式产生了深远的影响。AIGC不仅极大提升了设计师的工作效率,更激发了他们的创新思维,为设计行业带来了翻…

Spring Boot在java领域中有哪些优势

哈喽,大家好呀,淼淼又来和大家见面啦,随着云计算、微服务架构的兴起,Java开发领域迫切需要一套高效、灵活且易于上手的框架来应对日益复杂的业务需求。正是在这样的背景下,Spring Boot应运而生,以其独特的魅…

Dungeonborne联机失败、延迟高、卡顿的解决方法

Dungeonborne将第一人称动作的即时性与经典的西幻RPG职业设计巧妙融合,为玩家带来了一场前所未有的游戏体验。在这款沉浸式第一人称PvPvE地下城探险游戏中,我们可以独自深入探索,也可以与值得信赖的伙伴并肩作战,共同揭开地下城的…

移动端UI风格营造舒适氛围

移动端UI风格营造舒适氛围

中服云数字孪生平台引领工业物联仿真新纪元!

中服云数字孪生平台3.0是基于中服云物联网平台和数据中台打造的一款实时数据2D/3D集成展示监控平台。 旨在解决工业物联网数据的直观展示、实虚互动、仿真模拟、故障诊断、告警、预警、预测、实时观测、实时监控等问题。提供了数据采集、数据底座、监控逻辑、建模工具、展示互…

android 国内下载Gradle源

在中国使用 Gradle 时,可以配置使用一些国内的镜像源,以提高下载速度和稳定性。以下是几个常用的 Gradle 镜像源地址: 配置 gradle-wrapper.properties 文件: 阿里云: distributionUrlhttps\://services.gradle.org/distributions/gradle-7.…

数据结构 —— 图的遍历

数据结构 —— 图的遍历 BFS(广度遍历)一道美团题DFS(深度遍历) 我们今天来看图的遍历,其实都是之前在二叉树中提过的方法,深度和广度遍历。 在这之前,我们先用一个邻接矩阵来表示一个图&#…

220千伏变电站辅助设备智能监控平台 无人化与自动化升级改造工程

220千伏变电站特点 高电压等级:220千伏变电站的最大特点是其高压传输能力,能够将发电厂产生的电能高效地传输到较远的地区,满足大型城市及工业区域的用电需求。 输电能力大:220千伏变电站在输电能力上远大于普通的110千伏或更低…

Mybatis框架的集成使用

1_框架概述 框架是一个半成品,已经对基础的代码进行了封装并提供相应的API,开发者在使用框架时直接调用封装好的api可以省去很多代码编写,从而提高工作效率和开发速度,框架是一种经过校验、具有一定功能的半成品软件. 经过校验:指…