ios - 在 iOS WKWebView 中保留“Referer”标头?
问题描述
我在 WKWebView 中传递自定义标题。但是在重定向标头上会更新为新标头。例如,我在浏览器中输入了“MyName”,现在它会打开搜索结果,打印语句Referer 已更改“Referer”:“https://www.google.com/”如何在重定向中保留自定义标头。
函数头在 WKWebView, decidePolicyFor navigationAction: WKNavigationAction
重定向时得到更新。
navigationAction.request.setValue("/App/app/iOS", forHTTPHeaderField: "Referer")
那行不通
import WebKit
class WKWEBViewController: UIViewController, WKNavigationDelegate {
private var wkWebView: WKWebView!
var loadURLString = "https://www.google.com"
var customHeaders:[String:String] = ["Referer":"/AppleApp/app/iOS"]
override func viewDidLoad() {
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(true)
loadURL()
}
private func loadURL() {
let config = WKWebViewConfiguration()
wkWebView = WKWebView(frame: UIScreen.main.bounds, configuration: config)
wkWebView.navigationDelegate = self
wkWebView.backgroundColor = .white
wkWebView.scrollView.backgroundColor = .white
view.backgroundColor = .white
view.addSubview(wkWebView)
if let pdfurl = URL(string: loadURLString) {
var urlRequest = URLRequest(url: pdfurl)
if customHeaders.count != 0 {
for obj in customHeaders {
urlRequest.addValue(obj.value, forHTTPHeaderField: obj.key)
}
}
wkWebView.load(urlRequest)
}
}
}
extension WKWEBViewController {
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
let request = navigationAction.request
print("URl--->", request.url)
if let headers = request.allHTTPHeaderFields {
print("Headers: \(headers)")
} else {
print("Nope, sir")
}
decisionHandler(.allow)
}
}
解决方案
像下面这样?
import UIKit
import WebKit
class ViewController: UIViewController, WKNavigationDelegate {
// MARK: - IBOutlet
@IBOutlet weak var webView: WKWebView!
// MARK: - Life cycle
override func viewDidLoad() {
super.viewDidLoad()
webView.navigationDelegate = self
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
let urlStr = "https://www.google.com/"
if let url = URL(string: urlStr) {
let request = URLRequest(url: url)
webView.load(request)
}
}
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
var request = navigationAction.request
if let host = navigationAction.request.url?.host {
if host == "www.google.com" {
request.setValue("https://www.google.com/", forHTTPHeaderField: "Referer")
if let headers = request.allHTTPHeaderFields {
print("Google Headers: \(headers)")
}
}
}
decisionHandler(.allow)
}
}
以下是结果
Google Headers: ["Referer": "https://www.google.com/", "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 14_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML , 像 Gecko)", "接受": "text/html,application/xhtml+xml,application/xml;q=0.9, / ;q=0.8"]
推荐阅读
- postgresql - 带有部分索引的 SQLAlchemy Postgres upsert
- html - 如何在移动浏览器的网页上显示左右箭头?
- java - 将图片从我的应用存储移动到 Android 10+ 上的 DCIM 或图片目录
- regex - 如何在 GNU awk 中设置多字符记录分隔符 RS 使其包含新行?
- stm32 - 包含 .h 文件时的 SW4STM32 编译器错误
- javascript - 如何在 next.js 项目中实现 FreshworksWidget?
- android - Android 中基于 BLE 的 TLS 加密
- ios - 如何为 Apollo graphQL iOS 生成 Schema.json | 本地主机
- flask - 无需重启应用即可开发 Flask
- javascript - 如何在 rabbitmq 的 rpc 端点中增加消耗超时?