WKWebView设置请求头HTTPHeaderField

2023-11-11

WKWebView HTTPHeaderField

WKWebView的请求头添加字段。

系统的NSMutableHTTPURLRequest类提供了获取HTTP请求的请求头(HTTPHeader)和设置/添加HTTP请求的请求头的API。

@property (nullable, copy) NSDictionary<NSString *, NSString *> *allHTTPHeaderFields;

/*! 
    @method setValue:forHTTPHeaderField:
    @abstract Sets the value of the given HTTP header field.
    @discussion If a value was previously set for the given header
    field, that value is replaced with the given value. Note that, in
    keeping with the HTTP RFC, HTTP header field names are
    case-insensitive.
    @param value the header field value. 
    @param field the header field name (case-insensitive). 
*/
- (void)setValue:(nullable NSString *)value forHTTPHeaderField:(NSString *)field;

/*! 
    @method addValue:forHTTPHeaderField:
    @abstract Adds an HTTP header field in the current header
    dictionary.
    @discussion This method provides a way to add values to header
    fields incrementally. If a value was previously set for the given
    header field, the given value is appended to the previously-existing
    value. The appropriate field delimiter, a comma in the case of HTTP,
    is added by the implementation, and should not be added to the given
    value by the caller. Note that, in keeping with the HTTP RFC, HTTP
    header field names are case-insensitive.
    @param value the header field value. 
    @param field the header field name (case-insensitive). 
*/
- (void)addValue:(NSString *)value forHTTPHeaderField:(NSString *)field;

我们知道向HTTP请求的请求头里添加字段使用系统提供的上面两个API,并在请求知道添加即可,但是向WKWebView的请求Request的请求头里添加字段可能会有添加不上的情况。

可以跑Demo试一下,然后在Safari浏览器连手机在网页检查器里查看是否添加成功。

#import "ViewController.h"
#import <WebKit/WebKit.h>

@interface ViewController ()<WKUIDelegate,WKNavigationDelegate>

@property (nonatomic, strong) WKWebView *webView;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    
    WKWebViewConfiguration *confirg = [[WKWebViewConfiguration alloc] init];
    confirg.allowsInlineMediaPlayback = YES;
    self.webView = [[WKWebView alloc] initWithFrame:self.view.bounds configuration:confirg];
    self.webView.UIDelegate = self;
    self.webView.navigationDelegate = self;
    
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"https://www.jianshu.com/p/adb641dea4e0?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation"]];
    // 1. 设置无效
    //[request setValue:@"My App 20.01" forHTTPHeaderField:@"CustumAgent"];
    [self.webView loadRequest:request];
    [self.view addSubview:self.webView];
}

- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler
{
//    // 2. 设置无效
//    NSMutableURLRequest *request = (NSMutableURLRequest *)navigationAction.request;
//    NSString *custumAgent = [request valueForHTTPHeaderField:@"CustumAgent"];
//    if (!custumAgent || !custumAgent.length) {
//        [request setValue:@"My App 20.01" forHTTPHeaderField:@"CustumAgent"];
//    }
//    decisionHandler(WKNavigationActionPolicyAllow);
    
//    // 3. 设置无效
//    NSMutableURLRequest *request = (NSMutableURLRequest *)navigationAction.request;
//    NSString *custumAgent = [request valueForHTTPHeaderField:@"CustumAgent"];
//    if (!custumAgent || !custumAgent.length) {
//        [request setValue:@"My App 20.01" forHTTPHeaderField:@"CustumAgent"];
//        [self.webView loadRequest:request];
//    }
//    decisionHandler(WKNavigationActionPolicyAllow);

    // 4. iOS 14.2 上可行,iOS 14.1 以及以下版本无效
    NSMutableURLRequest *request = (NSMutableURLRequest *)navigationAction.request;
    NSString *custumAgent = [request valueForHTTPHeaderField:@"CustumAgent"];
    if (!custumAgent || !custumAgent.length) {
        [request setValue:@"My App 20.01" forHTTPHeaderField:@"CustumAgent"];
        [self.webView loadRequest:request];
        decisionHandler(WKNavigationActionPolicyCancel);
        return;
    }
    decisionHandler(WKNavigationActionPolicyAllow);
}
@end

综上,个人建议不要往WKWebView的请求中设置HTTPHeader,NSMutableHTTPURLRequest虽然提供了这个设置HeaderField的API,因为在加载WebView之前设置,不会生效,在webView:decidePolicyForNavigationAction:中再去设置的话感觉会有些晚了,逻辑上应该在发起请求之前就设置。

iOS 14.7 iPad Air 3,测试上述的两种设置方法,发现设置无效,无论是请求前还是回调后设置都设置不成功。

最后决定还是通过注入 js 的方式来设置吧

  • iOS端
    // 添加webView
    WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
    config.applicationNameForUserAgent = @"iOS iPad";
    self.webView = [[WKWebView alloc] initWithFrame:self.view.bounds configuration:config];
    self.webView.UIDelegate = self;
    self.webView.navigationDelegate = self;
    [self.view addSubview:self.webView];
    
    // 加载webView
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:URLStr]
                                                           cachePolicy:NSURLRequestUseProtocolCachePolicy
                                                       timeoutInterval:50];
    [self.webView loadRequest:request];
    
    // 方法注入,设置CustomUserAgent的值
    NSString *CustomUserAgent = [NSString stringWithFormat:@"%@ %@",@"1.234" ,@"5678"];
    [self addScriptHandlerTo:self.webView message:nil javascript:[NSString stringWithFormat:@"function addCustomUserAgentNode() { \n var hdObj = document.createElement(\"input\"); \n hdObj.type = \"hidden\"; \n hdObj.id = \"CustomUserAgent\"; \n hdObj.value = \"%@\"; document.body.appendChild(hdObj);}", CustomUserAgent]];
- (void)addScriptHandlerTo:(WKWebView *)webView message:(NSString *)message javascript:(NSString *)javascript {
    if (message) {
        [webView.configuration.userContentController addScriptMessageHandler:self name:message];
    }
    if (javascript) {
        WKUserScript *userScript = [[WKUserScript alloc] initWithSource:javascript
                                                          injectionTime:WKUserScriptInjectionTimeAtDocumentEnd
                                                       forMainFrameOnly:YES];
        [webView.configuration.userContentController addUserScript:userScript];
    }
}

#pragma mark - WKScriptMessageHandler

- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message
{
    
}
  • 前端

以下是 jd 端部分代码

    if (typeof addCustomUserAgentNode === "function") {
        const CustomUserAgent = document.getElementById("CustomUserAgent").value;
        myRequest.SetRequestHeader("CustomUserAgent", CustomUserAgent);
    }
function getCustomUserAgent() {
    if (typeof addCustomUserAgentNode === "function") {
        addCustomUserAgentNode();
    }
    let CustomUserAgent = "";
    const customUserAgentNode = document.getElementById("CustomUserAgent");
    if (customUserAgentNode) {
        CustomUserAgent = document.getElementById("CustomUserAgent").value;
    }
    return CustomUserAgent;
}

最后在浏览器里调试一下

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WKWebView设置请求头HTTPHeaderField 的相关文章

  • 如何将 WKWebView 恢复到应用程序关闭之前的状态?

    我陷入了死胡同 我只是想不出在用户关闭应用程序后恢复 WKWebView 的方法 当他重新打开它时 他访问过的所有网页都必须在那里 有什么建议么 当他重新打开时 他访问过的所有网页都必须存在 不可能的 访问过的网页的历史记录 backFor
  • WKWebView 在设备上显示空白,在模拟器上工作

    我的应用程序的模块之一是网站 该网站主要包含 SVG 绘图 并带有自定义形状的按钮 使用 Raphael js 库 来访问其他绘图 包含 svg 绘图的其他 html 页面 如果设备运行在 iOS 7 上 我使用 UIWebView 并且一
  • 如何在WKWebView上加载URL?

    我正在尝试在包含 CSV 文件的 WKWebView 上加载 URL 当我尝试正常加载时 它给了我一个错误 文件格式不受支持 可能已损坏 即使移动 safari 也给我同样的错误 然后我尝试使用 MIME 类型与 WKWebView 的以下
  • WKWebview注入cookie头导致重定向循环

    我试图将我单独获取的会话cookie注入到WKWebview请求中 结果证明这是相当痛苦的 我设法使用注入会话cookie这个解决方案 https stackoverflow com questions 26573137 can i set
  • macOS WKWebView 背景透明度

    如果有人有经验WKWebView 请分享如何使视图背景透明 这WebView对象有这样的选项var drawsBackground Bool get set 但它缺少WKWebView班级 我在网上搜索并 什么也没找到 以前可以通过以下方式
  • 包括 iOS8 的 WebKit 框架验证失败

    我正在使用 WebKit 框架的 WKWebView 当尝试提交到应用程序商店时 出现以下错误 Your app contains non public API usage Please review the errors correct
  • 无法子类化 WKWebView

    我正在尝试子类化 WKWebView 当我实现自己的初始化程序时 出现以下错误 required initializer init coder must be provided by subclass of WKWebView 好的 众所周
  • WKWebView 中的 Javascript - 评估 JavaScript 与 addUserScript

    我试图了解使用 WKWebview 执行 javascript 的最佳方式 有人可以给我使用 WKWebView 时的用例 最佳实践吗 何时使用添加用户脚本 and WKScript消息处理程序以及何时使用评估JavaScript let
  • iOS WKWebView 服务工作者

    从 iOS 15 开始 appCache 被禁用 所以我正在寻找替代方案 是否有启用 WKWebView Service Workers 的官方方法 我知道你可以添加 info plist 键WKAppBoundDomains然后通过实例化
  • 如何返回 WKWebView 历史记录中的起点

    我正在尝试找到一种方法来向后跳转到起点WKWebView历史 假设我有一个主页 起始页 WKWebView init 并带有指向 google com 的链接 所以我点击链接 然后点击下一步谷歌网站我点击另一个链接谷歌地图 所以我距离起始页
  • WKWebView 支持哪些文件类型?

    UIWebView支持完整的文件类型列表 详见这个 Apple 技术问答文档 https developer apple com library ios qa qa1630 index html apple ref doc uid DTS4
  • 调用文件选择器时,WKWebview 具有新的 iOS13 模式崩溃

    我在 iOS13 上的模态视图控制器中有一个 webview 当用户尝试将图像上传到网络视图时 它会崩溃 这是我得到的异常 2019 09 30 17 50 10 676940 0900 参与 988 157733 终止应用程序 由于未捕获
  • WKWebView - 防止用户文本选择触发自动滚动

    当用户执行点击并按住手势来选择单词 然后将手指向屏幕的顶部或底部边缘拖动时 页面会自动滚动以适应选择 这是一个短片演示它 https youtu be Fw4cqH4gt6Y 我想防止这种行为WKWebView 这是我到目前为止所尝试过的
  • 解包可选值 WKWebView 获取参数时意外发现 nil

    我在 WKWebView 上工作 当我加载没有像这样的参数的 url 时 它工作正常 func loadAddress lat Double lng Double let requestURL NSURL string http url c
  • 如何清除WKWebView的WKBackForwardList?

    看来backForwardListWKWebView 的属性是只读的 但我见过人们使用一些非常神奇的东西来解决这个问题 我需要找出某种方法来清除 WKWebView 的历史记录 我有什么想法可以这样做吗 到目前为止 我已经尝试了一些失败的技
  • 在WKWebView中使用自定义字体

    我在我的应用程序中使用自定义字体 它们被复制到捆绑包并硬编码到 appName info plist 这种字体在整个应用程序和 UIWebView 中完美运行 我正在加载 htmlString webView loadHTMLString
  • 如何自动缩放 WKWebView 的内容?

    要在 Swift 中自动缩放旧 WebView 中的网页 我所要做的就是 var w UIWebView w scalesPageToFit true 我找不到 WKWebView 的等效方法 并且网页在我的应用程序中显得太大 如何自动缩放
  • 存档的 macOS 应用程序启动时显示空白窗口

    我有一个 macOS 应用程序 其中包含一个 ViewController 可以重命名应用程序窗口并调整其大小 有几个按钮 以及一个在启动时加载默认网页的 WKWebView 该项目本身是一个 xcworkspace 文件 因为它包含用于
  • 如何缓存WKWebView加载的资源?

    I use WKWebView显示包括图像在内的富文本 我想将这些图像缓存在磁盘上 如何获取这些 HTTP 请求并缓存响应 默认设置对 WKWebView 中加载的所有资源进行缓存 您所要做的就是在 HTTP 响应中为这些资源设置正确的标头
  • WKWebview 中的 iCLoud 文档选择器关闭容器视图

    我有一个 WKWebview 加载基于 Web 的 UI 我希望用户能够从其 iCloud 文档上传文件 我已授予正确的权限 并且可以浏览 iCloud 文档 但是 当我选择文件或单击取消按钮时 文档选择器视图也会关闭 WKWebview

随机推荐

  • 勿以专家自居

    对于权威 我心存芥蒂 我在 StrongOpinions Weakly Held 观点鲜明 但不固执己见 一文中曾经说过 当我了解到别人把我视为专家或者权威 而不是像伙伴一样的志趣相投者时 我就会觉得非常困扰 如果非要说我在迄今为止的职业生
  • PCL学习之点云可视化:坐标字段、随机、单一颜色、法向量

    pcl中几种常见的点云渲染方式 1 颜色区别深度 此方法在PointCloudColorHandlerGenericField类中实现 该将不同的深度值显示为不同的颜色 实现以颜色区分深度的目的 PointCloudColorHandler
  • TCP/IP校验和计算算法

    ICMP IP UDP TCP报头部分都有checksum 检验和 字段 ICMP和IP报头校验和的计算都很简单 过程如下 1 把校验和字段置为0 2 对IP头部中的每16bit进行二进制求和 3 如果和的高16bit不为0 则将和的高16
  • ubuntu16.04\18.04安装Azure Kinect SDK+配置ros版 超全详细踩坑记录

    一些参考 1 官网教程Azure Kinect Sensor SDK 官网教程Azure Kinect ROS Driver 2 Azure Kinect SDK Ubuntu 16 04 18 04安装配置方法 3 ubuntu16 04
  • 无监督学习分类

    把输入数据看成一个行 m 为特征 列 N 为样本的矩阵 则从数据角度 可以将无监督学习分为三类 将数据按列划分 即将相似的样本聚到同类 即对数据进行聚类 代表算法k means 层次聚类 将数据按行划分 把高维空间的向量转化到低维空间的向量
  • 《吃透 MQ 系列》之Kafka精妙的高性能设计(下篇)

    在 上一篇文章 中 指出了高性能设计的两个关键维度 计算和 IO 可以将它们理解成 道 同时给出了 Kafka 高性能设计的全景图 可以理解成 术 图 1 Kafka 高性能设计的全景图 这篇文章将继续对存储消息和消费消息的 8 条高性能设
  • 基于C语言的栈

    基于王道数据结构 include
  • 开源静态代码检测工具Splint

    如果想用一个有效的工具察看C C 源代码中的错误 遗漏 不确定的构建过程 以及移植问题等等 你应该来看看Lint 可以把Lint当成一个编译器 除了不产生代码之外 对于错误和警告的报告来说已经非常足够了 通常 一个C C 的编译器假设程序是
  • Java实现人脸登录、注册等功能【完整版】

    推荐 前些天发现了一个巨牛的人工智能学习网站 通俗易懂 风趣幽默 忍不住分享一下给大家 点击跳转到网站 前言 这段时间由于学校实行静态化管理 寝室门和校门都是用了人脸识别的装置 每次经过都会激发我的好奇心 也想自己搞一个人脸识别玩玩 随着开
  • python机器学习 transform,fit_transform

    首先使用transfer StandardScaler 来实例化一个转换器 我们要对训练集和测试集进行相同的归一化 标准化处理 先处理训练集 x train transfer fit transform x train fit transf
  • 【纯干货】学python的,这些能快速月入过万的兼职途径,你不会还不知道吧

    我想辞职 在这个疫情当下的时代 许多打工人都有过这么一个想法 或许是因为工作待遇 亦或许是其他原因 但是却仍然屹立在工位上 有的甚至天天喊辞职 月月拿满勤 这是为什么呢 因为他们虽然无数次筹谋辞职 却也无数次的担心裸辞之后的压力 而作为平平
  • Hyper Terminal 配置体验分享

    Hyper Terminal 简介 Hyper is an Electron based terminal Built on HTML CSS JS Fully extensible 以上内容来自Hyper Terminal官网对该终端的介
  • 基于卷积神经网络-门控循环单元(CNN-GRU)多输入多输出预测,CNN-GRU回归预测。

    清空环境变量 warning off 关闭报警信息 close all 关闭开启的图窗 clear 清空变量 clc 清空命令行 导入数据 res xlsread 数据 xlsx 数据分析 num size 0 8 训练集占数据集比例 ou
  • vue解决弹出图片显示在弹框下方

    弹出的图片显示在弹框下面怎么办 问题来源 问题分析 解决方法 问题来源 在写前端vue项目时 在用到ele的 el image 这个组件时 有时会出现图片显示在弹框即dialog下面 后面发现是因为el image组件 默认的z index
  • 【ffmpeg基础】ffmpeg的下载安装

    一 ffmpeg的下载 1 ffmpeg github下载路径 https github com FFmpeg FFmpeg git 在ffmpeg的github上可以下载任意版本的源码 比如最新的matser上的源码 以及各个分支上 如f
  • unity 屏幕虚拟键盘

    工作上碰到许多程序需要用到键盘输入功能 调用的电脑自带键盘使用也不方便 自己写的一个键盘工具 功能 键盘大小写状态监测 设置了输入法提示词位置的定位 定位根据屏幕分辨率设置 故编辑器模式下位置有偏移 可自行调整 工具连接 https dow
  • rocketMq消息队列原生api使用以及rocketMq整合springboot

    rocketMq消息队列 文章目录 rocketMq消息队列 一 RocketMQ原生API使用 1 测试环境搭建 2 RocketMQ的编程模型 3 RocketMQ的消息样例 3 1 基本样例 3 2 顺序消息 3 3 广播消息 3 4
  • Friend-Graph HDU - 6152 签到题 暴力遍历

    Friend Graph HDU 6152 题意 给你n个人 告诉你他们之间的关系 如果有三个以上的人互相不认识或者互相认识 就认为这个团队是 Bad Team 反之输出 Great Team 我的想法就是暴力搜索 用一个二维数组保存每个人
  • 利用硬件实现矩阵乘法加速

    对于绝大多数程序员来说 优化程序往往是在算法方面 但了解一定的计算机硬件知识后 可以隐式地优化程序 下面以矩阵乘法为例 探讨计算机硬件在程序优化中的作用 原理 学过计算机组成原理的都知道 CPU访问内存的速度比CPU计算速度慢得多 为了解决
  • WKWebView设置请求头HTTPHeaderField

    WKWebView HTTPHeaderField WKWebView的请求头添加字段 系统的NSMutableHTTPURLRequest类提供了获取HTTP请求的请求头 HTTPHeader 和设置 添加HTTP请求的请求头的API p