監聽 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.pswp.cn/diannao/40627.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/40627.shtml
英文地址,請注明出處:http://en.pswp.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可以省去很多代碼編寫,從而提高工作效率和開發速度,框架是一種經過校驗、具有一定功能的半成品軟件. 經過校驗:指…