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

news2024/7/6 20:12:20

需求

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

实现

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

实现步骤

  1. 创建自定义 URL Scheme Handler

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

import WebKit

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) {
        // 处理请求取消逻辑
    }
}
  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 WebKit

class 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 WebKit

class 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.coloradmin.cn/o/1891112.html

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

相关文章

大陆ARS548使用记录

一、Windows连接上位机 雷达是在深圳路达买的,商家给的资料中首先让配置网口,但我在使用过程中一直出现无法连接上位机的情况。接下来说说我的见解和理解。 1.1遇到的问题 按要求配置好端口后上位机无连接不到雷达,但wireshark可以正常抓到数…

基于改进YOLOv5s的跌倒行为检测 | 引入SKAttention注意机制 + 引入空间金字塔池化结构SPPFCSPC + 结合ASFF自适应空间融合

前言:Hello大家好,我是小哥谈。为了实现电厂人员跌倒行为的实时检测,防止跌倒昏迷而无法及时发现并救援的事件发生,针对跌倒行为检测实时性以及特征提取能力不足的问题,提出了一种改进YOLOv5s的跌倒行为检测算法网络&a…

公网IP变更自动微信通知与远程执行命令的C++开源软件

基本功能 智能公网IP变更监测与微信通知 一旦检测到公网IP地址发生变更,系统将自动通过预设的QQ邮箱(该邮箱与微信绑定,实现微信通知)发送新IP地址通知。同时,软件会即时更新本地配置文件中的IP地址及变更时间&#…

MySQL Server使用

MySQL Server MySQL Server基本操作查看数据库服务命令行连接(这些操作都可以在workbench中进行) MySQL Server基本操作 MySQL基础:安装卸载与配置 查看数据库服务 电脑–管理–管理和应用程序–服务–MySQL80 命令行连接(这…

Linux线程:编织并发的梦幻世界

目录 🚩引言 🚩听故事,引概念 🚩生产者消费者模型 🚀再次理解生产消费模型 🚀挖掘特点 🚩条件变量 🚀条件变量常用接口 🚀条件变量的原理 🚩引言 上一篇…

HQChart报价列表高级应用教程7-走势列数据对接

HQChart报价列表高级应用教程7-走势列数据对接 走势列小程序效果图PC效果图HQChart代码地址走势列类型配置走势列数据格式示例走势列 单独使用一列显示每个股票的走势图 小程序效果图 PC效果图 HQChart代码地址 地址:github.com/jones2000/HQChart

医院挂号系统:基于JSP和MySQL的现代化医疗预约平台

开头语:您好,我是专注于医疗系统开发的IT学长。如果您对医院挂号系统感兴趣,欢迎联系我。 开发语言:Java 数据库:MySQL 技术:JSP技术,B/S架构 工具:Eclipse,MyEclips…

大模型对汽车行业意味着什么?_汽车企业大模型

引 言 大模型是一种利用海量数据进行训练的深度神经网络模型,其特点是拥有庞大的参数规模和复杂的计算结构。通过在大规模数据集上进行训练,大模型能够学习到丰富的模式和特征,从而具备强大的泛化能力,可以对未知数据做出准确的预…

10 - matlab m_map地学绘图工具基础函数 - 绘制多边形区域、流线图、散点图和添加注释的有关函数

10 - matlab m_map地学绘图工具基础函数 - 绘制多边形区域、流线图、散点图和添加注释的有关函数 0. 引言1. 关于m_patch2. 关于m_streamline3. 关于m_scatter4. 关于m_annotation5. 结语 0. 引言 本篇介绍下m_map中绘制多边形区域函数(m_patch)、绘制流…

Landsat数据从Collection1更改为Collection2

目录 问题解决 问题 需要注意!您使用的是废弃的陆地卫星数据集。为确保功能持续,请在2024年7月1日前更新。 在使用一些以前的代码时会遇到报错,因为代码里面用的是老的数据集 解决 对于地表反射率SR,需要在name中,将C01换为C02&…

Mysql-基础-DDL操作

1、数据库操作 查询 查询所有数据库 show databases; 创建 创建数据库 create database [if not exists] 数据库名 使用及查询 use 数据库名 select database() 查询当前所处数据库 删除 drop database [if not exists] 数据库名 2、表操作 查询当前库中的所…

SpringBoot源码阅读3-启动原理

SpringBootApplication public class DistApplication {public static void main(String[] args) {// 启动入口SpringApplication.run()SpringApplication.run(DistApplication.class, args);} }1、服务构建 这里"服务"指的是SpringApplication对象,服务…

安防视频监控/视频汇聚EasyCVR平台国标GB28181级联上级平台,视频无法播放是什么原因?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快,EasyCVR基于云边端一体化架构,具有强大的数据接入、处理及分发能力,可提供7*24小时实时高清视频监控、云端录像、云存储、录像检索与回看、智能告警…

24位DAC转换的FPGA设计及将其封装成自定义IP核的方法

在vivado设计中,为了方便的使用Block Desgin进行设计,可以使用vivado软件把自己编写的代码封装成IP核,封装后的IP核和原来的代码具有相同的功能。本文以实现24位DA转换(含并串转换,使用的数模转换器为CL4660)为例,介绍VIVADO封装IP核的方法及调用方法,以及DAC转换的详细…

【postgreessql 】统计库中的所有表数量

在PostgreSQL中,你可以使用SQL查询来统计数据库中的所有表数量。这通常涉及到查询系统目录表,特别是 pg_catalog.pg_tables 表,它存储了关于数据库中所有表的信息。 SELECT COUNT(*) FROM information_schema.tables WHERE table_schema IN …

游戏冻结工具 -- 雪藏HsFreezer v1.78

软件简介 HsFreezer是一款多功能游戏冻结工具,它允许用户随意暂停和继续游戏,同时具备系统优化和进程管理的功能。这款软件特别适合希望在游戏加载时间节省或在游戏与其他任务之间快速切换的用户。其主要特点包括快捷键操作、单锁模式的丝滑切换&#x…

【大数据】StarRocks的系统架构

StarRocks 架构简洁,整个系统的核心只有 FE(Frontend)、BE (Backend) 或 CN (Compute Node) 两类进程,方便部署与维护,节点可以在线水平扩展,元数据和业务数据都有副本机制,确保整个系统无单点。…

数据大小端问题

文章目录 大小端前言函数引用(接下来使用此函数对高低位进行切换)先看截取的对于大小端的定义大小端数据的直观理解[重点] 对uchar数组进行取操作定义一个uint8_t的数组观察起内部内存尝试使用uint32_t 每次区 1、2、3、4byte数据 提升经过上面的介绍一定对大小端有了一定的了解…

桥梁监测系统:守护桥梁结构安全的科技利器

桥梁是城市交通的重要组成部分,然而,长期以来,桥梁结构的健康问题一直是人们关注的焦点。传统的人工巡检方式无法全面准确地掌握桥梁结构的实时状况,因此,桥梁监测系统应运而生。桥梁监测系统是一种基于传感器、信息处…

数据结构 - C/C++ - 树

公开视频 -> 链接点击跳转公开课程博客首页 -> 链接点击跳转博客主页 目录 树的概念 结构特性 树的样式 树的存储 树的遍历 节点增删 二叉搜索树 平衡二叉树 树的概念 二叉树是树形结构,是一种非线性结构。 非线性结构:在二叉树中&#x…