
一开始想到的方式是:通过WKNavigationDelegate的代理方法- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler
来在请求之前获得请求信息,并把请求头信息添加进去,如下:
-(void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler{
NSLog(@"灰度测试h5Url: %@",navigationAction.request.URL.absoluteString)
if ([navigationAction.request.URL.absoluteString containsString:OUR_URL_ID]) {
// 拦截所有网络请求头,重新添加参数请求头信息
NSMutableURLRequest *mutableRequest = [navigationAction.request mutableCopy]
NSDictionary *requestHeaders = navigationAction.request.allHTTPHeaderFields
if ([requestHeaders isKindOfClass:[NSDictionary class]]) {
//简单通过Version_Key判断下是否已经加入了请求信息
if ([AFNetWorkManager KeyUrlrequestOneNull:requestHeaders]) {
[AFNetWorkManager addWebDefaultKeyUrlrequest:mutableRequest]
[webView loadRequest:mutableRequest]
NSLog(@"灰度测试h5Url: %@ \n请求头:%@",navigationAction.request.URL.absoluteString,mutableRequest.allHTTPHeaderFields)
decisionHandler(WKNavigationActionPolicyCancel)
return
}else{
//参数正常,放开请求
NSLog(@"灰度测试h5Url: %@ \n请求头:%@",navigationAction.request.URL.absoluteString,requestHeaders)
decisionHandler(WKNavigationActionPolicyAllow)
}
}else{
//没有请求头,加上新的请求头,并赋予参数
mutableRequest.allHTTPHeaderFields = [NSMutableDictionary new]
[AFNetWorkManager addWebDefaultKeyUrlrequest:mutableRequest]
[webView loadRequest:mutableRequest]
NSLog(@"灰度测试h5Url: %@ \n请求头:%@",navigationAction.request.URL.absoluteString,mutableRequest.allHTTPHeaderFields)
decisionHandler(WKNavigationActionPolicyCancel)
}
}else{
//本地请求资源,pdf等
decisionHandler(WKNavigationActionPolicyAllow)
}
}
但是经过打印发现,只拦截了一些html请求,向png、css、js资源请求,并没有拦截到,甚至没有走这个方法。
无奈,只能网上搜索,结果发现了:https://github.com/fenglee594/WKWebViewRequestHook
这个demo,稍加改动,亲测有效。
header请求头这种最好是不通过服务器,比如如果通过服务器NGINX配置,会出现很多问题,包括请求头丢失,请求头拦截,最好的方式通过直接跟web直接交互,比如WebViewJavascriptBridge或者原生自带的方式做交互,更方便,如果有更好的方案留言给我,阿里嘎多
在WKwebview因为加载请求是个异步 *** 作,所以在初次webview loadrequest时候不需要加入header ,而是拦截webview的请求 ,在请求头中加入header,并且重复请求,但是还有一定问题 ,有时会有header丢失问题,所以我觉得最优解决方案是通过交互传参数可以解决这个问题,如果有更好方案请告诉我。
这个问题首先你要明白,WKWebView有自己的进程,使用自己的存储空间来存储cookie和cache,WKWebView会忽视NSURLCache、NSHTTPCookieStorage、NSCredentialStorage这些默认的网络存储, 其他的网络类如NSURLConnection是无法访问到的。 同时WKWebView发起的资源请求也是不经过NSURLProtocol的,导致无法自定义请求。
让WKWebview支持NSURLProtocol可参考: NSURLProtocol对WKWebView的处理
所以这里应该很清楚,NSHTTPCookieStorage已经用不到了,但是你可以把他作为存储cookie到本地的工具使用。我自己的项目里面已经全部删除了它的使用
以我项目为例,这种方法设置的cookie,不能被js读取到,在浏览器调试中也不能看到。所以通过js开发的此方式不可用,但是可以被PHP等动态语言读取,由于我的项目都是用js开发的,故不用此方式,也不做兼容。这里就不做过多的使用介绍。
这种方式不好的地方就是,只能在初始化的时候注入,如果cookie的值发生变化,就需要重新初始化,就变得比较low。所以这种方式的cookie尽量保证他的值是不变的,比如设备号、设备类型、来源等信息。使用方法如下图:
使用起来就比较方便了。如图:
最后可能还会遇到问题,前端获取不到,但是我的cookie确实设置成功了,在safari调试器中可以明确的看到cookie确实设置成功了。我猜想可能是由于cookie设置成功的时机在前端使用cookie值的时机之后造成,也无法解决。
前几天看到一篇文章: 苹果拒绝了16个Web API
说了一堆,总结一下就是苹果觉得cookie不安全。所以cookie中尽量设置一些无关紧要的参数,或者就尽量不去使用。
毕竟cookie这个坑,踩起来难受!!!
个人不推荐使用Cookie!
这都是避免出现Android和iOS出现两种不同的传值方式,测试效果上看性能无优劣,只是一种传值方式而已!!!,且看使用起来是否顺手。
一、可以拼接在地址后面,有加密需要的加密
二、通过JSBridge传值,我自己使用的 WebViewJavascriptBridge, 这种方式需要在页面加载完成之后才会起效。
三、将要传的值添加到NSMutableURLRequest的header内,如图:
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)