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 的相关文章

  • 迁移 UIWebView 到 WKWebView

    在我的 iOS 应用程序中 我尝试将旧的 UIWebView 代码迁移到 WKWebView 因为理论上 WKWebView 比 UIWebView 更快 更高效 我看过很多教程 比如here https stackoverflow com
  • WKWebView 函数用于检测 URL 是否已更改

    WKWebView 类是否有一个函数可以让您检测到该 WebView 的 URL 何时发生更改 The didCommit and didStartProvisionalNavigation在使用 WebView 中的某些元素时 函数似乎并
  • iframe 可以在 WKWebView 中与 Cordova 一起使用吗?

    根据 Apache Cordova 博客 iframe 可能无法使用 WKWebView https cordova apache org news 2018 08 01 future cordova ios webview html ht
  • 在 WKWebView 中启用应用程序缓存

    我知道 iOS WKWebView 不支持离线应用程序缓存 这是在 Safari 中启用的 所以我在 webkit 项目中搜索了负责的代码并发现了这个 WK首选项 void setOfflineApplicationCacheIsEnabl
  • 如何更改 OS X Yosemite 中的 WKWebview 用户代理?

    如何更改使用的用户代理WKWebview 与年长的WebView 我可以编写以下内容来更改用户代理 myWebView setCustomUserAgent Mozilla 5 0 Macintosh Intel Mac OS X 10 9
  • 如何返回 WKWebView 历史记录中的起点

    我正在尝试找到一种方法来向后跳转到起点WKWebView历史 假设我有一个主页 起始页 WKWebView init 并带有指向 google com 的链接 所以我点击链接 然后点击下一步谷歌网站我点击另一个链接谷歌地图 所以我距离起始页
  • WKWebView 添加为子视图在 Swift 中旋转时不会调整大小

    我正在努力向我的浏览器应用程序添加新的阅读视图 它是另一个视图控制器 仅包含作为子视图添加的 WKWebView 并带有用于关闭视图的按钮 和手势 一切都很好 但是当我旋转设备时 子视图的大小没有调整 所以我的屏幕的一半是空的 阅读视图中的
  • WKWebView - 防止用户文本选择触发自动滚动

    当用户执行点击并按住手势来选择单词 然后将手指向屏幕的顶部或底部边缘拖动时 页面会自动滚动以适应选择 这是一个短片演示它 https youtu be Fw4cqH4gt6Y 我想防止这种行为WKWebView 这是我到目前为止所尝试过的
  • 在WKWebView中使用自定义字体

    我在我的应用程序中使用自定义字体 它们被复制到捆绑包并硬编码到 appName info plist 这种字体在整个应用程序和 UIWebView 中完美运行 我正在加载 htmlString webView loadHTMLString
  • 无法将 WKWebView 添加到 Xcode 项目

    我有一个看起来像这样的 ViewController import UIKit import WebKit class ViewController UIViewController IBOutlet var webView WKWebVi
  • 防止 Angular NativeScript WebView 通过捏合缩放进行缩放

    所以我有一个使用 Angular NG 5 1 1 Angular 7 x 的 Nativescript 应用程序 我有一个带有网络视图的视图 ViewChild myWebView webViewRef ElementRef
  • 在 iOS 中使用 WKWebView 请求桌面站点

    我到处搜索 但找不到一种方法来请求网站的桌面版本而不依赖网站本身 他们自己的 桌面版本 按钮 有没有办法做到这一点 我认为如果我可以让它在 UIWebView 中工作 那么在 WKWebView 上也可以以相同的方式完成 如果你只关注iOS
  • WKWebView 缓存清单不适用于 IOS8

    缓存清单工作正常 并且在 IOS 8 的 safari 中触发事件 在 WKWebView 中根本不起作用 还有其他人解决这个问题吗 导入 UIKit 导入WebKit class ViewController UIViewControll
  • WKWebView CALayer 到图像导出空白图像

    我试图截取网页的屏幕截图 但图像始终为空白 白色 我正在使用此代码进行转换CALayer to Data 取自这里 https stackoverflow com a 41387514 4859791 extension CALayer G
  • 使用 swift 在 WKWebView 上显示活动指示器

    我正在处理以下代码 并尝试在页面加载时在视图中显示活动指示器 我尝试实施WKNavigationDelegate方法 但我失败了 因为没有任何显示 对于如何解决这个问题 有任何的建议吗 我没有设置 SupportWebView 视图dele
  • 在 JavaScript 中检测页面是否加载到 WKWebView 中

    如何使用 javascript 可靠地检测到页面已加载到 WKWebView 中 我希望能够检测到这些场景 iOS 和 WKWebView iOS 和 Safari not iOS 关于 UIWebView 有一个类似的问题here htt
  • 如何将 WKUIDelegate 实现到 SwiftUI WKWebView 中?

    我正在 Xcode v11 上创建一个 Web 应用程序 但在实现 WKUIDelegate 来显示 Javascript 警报并在 Web 应用程序上正确确认时遇到问题 我在 ContentView swift 上得到了一个非常简单的 w
  • iOS计算带有嵌入推文的html字符串的正确WKWebview高度

    我正在使用 wkwebview 使用 loadHTMLString 方法加载给定的 HTML 字符串 在 wkwebview didFinishNavigation 之后 我通过评估 javascript document height 将
  • 在ios swift中登录后从wkwebview获取令牌

    我正在 wkwebview 中加载一个用于登录的网址 成功登录后 它将重定向到内部页面 从那里单击按钮时 它将重定向到生成令牌的另一个页面 生成令牌后如何将其推送到 swift 应用程序 我需要将该令牌用于我的应用程序中的进一步使用 请帮忙
  • 在 WKWebView 中禁用放大手势

    我正在寻找一种方法来禁用 WKWebView 的 iOS 实现上的 捏合缩放 放大手势 OS X 有一个 magnification BOOL 属性 但在 iOS 上似乎不可用 WKWebView h if TARGET OS IPHONE

随机推荐

  • 勿以专家自居

    对于权威 我心存芥蒂 我在 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