Cookie处理
在设置Cookie
的时分,我们常常做的是在央求的央求头里添加 Cookie
,可是这仅仅把Cookie
发送给了服务端,我们本地并没有保存 Cookie
,Cookie
毕竟要写到WebView
的一个Cookie
文件目录里面,后续WebView
里面自己的建议的央求或许跳转才华在google空间建议央求的时分在对应浏览器前史记录设置的域名下面取到Cookie
传出去。长沙师范学院
Webview
加载 H5 页面,实际上是把页面相关的.html、js、css
文件下载到本地,然后再加载,这时页面去获取 Cookie
的时分,是去本地Wgoogle服务结构ebView
里长沙市天气的Cookie
文件目录里查找,浏览器的前史记录在哪假设没有设置的话java环境变量配置必定就找不到了。所以在设置Cookihttp 404e
的时分,服务端和客户端都要设置。
一、服务端 Cookie 设置
在运用UIWebView
的时分,我们是经过 NSHTTPCookieStorage
来办理 Cookie
的,下面我们给devqiaoyu.tech
这个域名添加一个名为user
的Cookie
。
var props = Dictionary<HTTPCookiePropertyKey, Any>()
props[HTTPCookiePropertyKey.name] = "user"
props[HTTPCookiePropertyKey.value] = "浏览器的前史adm浏览器的前史in"
props长沙市天气[HTTPCookiePropertyKey.path] = "/"
props[HTTPCookieProjavaeepertyKey.domain] = "devqiaoyu.tech"
props[HTTPCookiePropertyKey.versi浏览器前史记录删了怎样找回on] = "0"
props[HTTPCookiePropertyKey.originURL] = "devqiaoyu.tech"
if let cookie = HTTPCookie(properties: props) {
HTTPCookieStorage.shargoogle翻译ed.setCookie(cookie)java言语
}
WKWebView Cookie
问题在于WKWebView
建议的央求不会主动带上存储于NSHTTPCookieStorage
容器中的Cookie
。
解决方法也很简单,就是在WKWebView
建议央求之前,先从NSHTTPCookieStorage
读取Cookie
,然后手动浏览器往UR浏览器LRequest超神兽宠店
的央求头里添加一下Cookie
。
func getCookie() -> String {
var cookieString = ""
if let cookies = HTgoogleTPCookieStorage.shared.cookies {
for cookie in cookies {
if cookie.domain == cookieDomaihttp协议n {
let str = "(cookie.name)=(cookie.value)"
cohttpwatchokieString.append("(str);")
}
}
return cookiejava模拟器String
}
var reque浏览器拜访过于频频不能用st = URLRequ浏览器est(url: URL(string: "https://devqiaoyu.com"))
rhttp 404equest.addValue(getCookie(), forHTTPHeaderFieldjava模拟器: "Cookie")
当服务器java基础知识点页面产生google空间重定向的时分,此刻第一次在RequestHeader
中写入的Cookie
会丢掉,还需要对重定向的央求从头做添加Cookie
的处理。具体方法请往下看~
二、客户端 Cookie 设置
上面这么写完了,当页面加载的时分,后端无论是啥言语,http协议都能从央求头里看到Cookie
了,可是后端烘托回来页面后,在客户端的WebjavascriptV浏览器的前史记录在哪iew
里运行的时分,JS 在实行的时分调用 document.cookie
API 是读取不到Cookjavaeeie
的,所以还得针对客户端Cookie
进行处理。
var cookieString = "浏览器的浏览前史怎样删除"
if let cookies = HTTPCookieStorage.shared.cookies {
for cookie in cookies {浏览器
if cookie.domain == "devqiaoyu.tech" {
let str = "(cookie.name)=(cookie.value)"google服务结构
cookieString.append("document.coogoogle服务结构kie='(str);path=/;domain=devqiaoyu.tech';")
}
}
}
let cookieS浏览器前史记录删了怎样找回cript = WKUserScrgoogle地球ipt(source: cookieString, inj长沙师范学院ectionTime: .atDojava面试题cumentStart, forMainFrameOnly: false)
let userConthttp://192.168.1.1登录entController = WKUserConte超崇高骑士ntController(java环境变量配置)
userContentController.addUserScript(cookieScript)
let webViewConfig = WKWebViewConfiguration()
webViewConfig.userContentController = userContentController仓鼠养殖八大忌讳
lhttp协议et webV = WKWebView(frame: CGRect.zeJavar浏览器下载o, cojava怎样读nfiguration: webViewConfig)
**客户端Cookie
注Google入实际上就是创立一个 J超神兽宠店S 脚本,让WebView
去实行,推荐在.atDocumentStart
这个机会进行预置静态 JS 的注入。**这样WebView
在加载后端回来的静态页面的时分,就能够拿到保存着客户端的Cookie
了。
留心:document.coogoogle谷歌查找主页kie() 无法跨域设置 Cookie,比如你浏览器拜访过于频频不能用第一次加载的央求时 www.baidu.com ,在重定向的时分跳转到了 www.google.com ,那么第二个央求就可能因为没有携带
Cookie
而无法仓鼠养殖八大忌讳拜访。当然啦,解决方法还是有的,请往下看~
URL阻遏
在WKWebView
中,每google服务结构一次页面跳转之前,都会调用下面的回调函数:
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: W长沙师范学院KNavigationAction, decisionHajava工作培训班ndler: @escaping (WKNgoogleavigationActionPolicy) -> Void)
Web 页面重定向问题
重定向问题有两种:
- 服务器页面重定向,需要对新建议的央求从头种
Cookie
- 本地页面重定向,只需浏览器拜访过于频频不能用客户端设置了
Cookie
,那么就不需要处理了
所以假设是服务http://www.baidu.com器页面重定向,那么判断此刻Request
是否有你要的Cookie
没有就Cancel
掉,修正R浏览器怎样打开网站equest
从头主浏览器拜访过于频频不能用张。
func webView(_ webView: WKWebView, degoogle翻译cidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void)
{
var shouldCancelLoadURL = false
if let cookie = navigationAc长生十万年tion.reque浏览器的前史st.value(forHTTPHeaderField: "Cookie") {
if cookie.contains("user") {
shouldCancelLoadURL = falshttp 404e
} else {
var request = URLRequest(url: URL(string: (navigationAction.request.url?.absojava基础知识点luteString)!)!)
request.addValue(getCookie(), forHTTPHeaderField: "Cookie")httpwatch
webView.load(regoogle地球quest)
shouldCancelLoadURL = trgoogleue
}
} else {
var request = URLRjava工作培训班equest(url: URL(string: (navigationAction.request.url?.absoluteStrjava环境变量配置ing)!)!)
request.addValue(getCookie(), forHTTPHeaderField: "Cookie")
webView.load(request)
shouldCancelLoadURL = true
}
if shouldCHTTPancelLoadURL {
decisionHandler(WKNavigatiJavaonActionP浏览器的前史记录在哪olicy.cancel)
} else {
decisionHagoogleplay安卓版下载ndler(WKNavigationActionPolicy.allow)
}
}
跨域问题
针对跨域的问题,解决方法和上面的方法相似,仅仅是判断条件不同。
func webView(_ webVijavaeeew: WKgoogle浏览器WebView, decidePolicyFor navigatiogoogle地球nAction: WKNavigationAction, decisionHandler: @escaping (WKNavigagoogleplay安卓版下载tionActionPolicy) -> Void)
{
var shouldCancelLoadURL = false
if let url = navigationAction.request.url?.absoluteString {
if url.contains("devqiaoyu.tech") { // 本来的域浏览器怎么查看前史浏览记录名
shouldCancelLoadURL = false
} else {
// 从头建议央求,种Cookie
shouldCancelLoadURL = true
}
} else {
// 从头建议央求,种Cookie
shouldCancelLoadURL = true
}
if sho超崇高骑士uldCancelLoadURL {
decisionHandler(WKNgoogle空间avigationActionPolicy.cancel)
} else {
decisionHandler(WKNavigationActionPolicy.allow)
}
}
假跳转的央求阻遏
一种 JS 调用 Native 的通讯计划,具体介绍能够看从零收拾一个hybrid结构(一)– 从挑选JS通讯计划初步。下面内容是从该文章内摘录的。
何谓 假跳转的央求阻遏 就是由网页宣告一条新的跳转央求,跳转的目的地是google地球一个不合法的压根就不存在的地址,比如
//常规的Http地址
https:/http代理/wenku.baidu.com/xxxx?xx=xx
//假的央求通讯地址
wakaka://wahahal长生十万年alala/action?param=paramobj
看我下面写的那条假跳浏览器的前史记录在哪转地址,这么一条什么都不是的扯淡地址,直接放到浏览器里,直接扔到WebView
里,必定是妥妥的什陈思思么都打不开的,而假设在经过我们改造过的Hybrid WebView
里,进行阻遏不进行跳转
url 地址分为这么几个部分
- 协议:也就是
http/https/file
等,上面用了wakaka
- 域名:java怎样读上面的google浏览器
wenku.baijava编译器du.com
或wahahalalala
- 途径:上面的
xxxx?
或action?
- 参数:上面的
xx=xx
或param=paramobj
假设我们构建一条假url
- 用协议与域名作为通讯辨认
- 用途径作为指令辨认
- 用参数作为数据传递
客户端会无差别Java阻遏悉数央求,真正的 url 地址应该照旧放过,只有协议域名匹配的 url 地址才应该被客户端阻遏,阻遏下来的 url 不会导致 WebViewjava怎样读 持续跳转差错地址,因而无感知,相反阻遏下来的 url 我们能够读取其间途径作为指令,读取其间参数作为数据,然后依据约好调用对应的 Native 原生代码
以上其实是google地球一种 协议约好 只需 JS 侧按着这个约好协google谷歌查找主页议生成假 url,Native 按着约好协议阻遏/读取假 url,整个流程就能跑通。
User-Agent设置
全局设置
就是App
内悉数Web
央求的Usehttp://www.baidu.comr-Agent
悉数被修正。浏览器前史上的痕迹在哪里
// UIWebView
lehttp协议t webView = UIWebView(frame: CGRect.zero)
let userAgent = wejava模拟器bVhttp 302iew.stringByEvaluatingJavaScript(from: "navigator.userAgent")
if let崇圣寺三塔 agent = userAgent {
let user = "@(agent);extra_user_agent"
legoogle空间t dict = ["UserAgent":user]
UserDefa仓鼠养殖八大忌讳ults.standard.register(defaults: dict)
}
// WKWehttp://192.168.1.1登录bView
let webV =https和http的区别 WKWebView(frame: CGRecthttp 404.zero)
wGoogleebV.eval浏览器拜访过于频频不能用uateJavaScript("navigator.userAgent") { (result, err浏览器前史记录设置or) in
if let oldAgent = result as? Stjava言语ring {
let user = "@(oldAgent);extra_user_agent"
let dict = ["UserAgenGooglet":user]
UserDefaults.standard陈思思.register(de浏览器的前史faults: dict)
}
}
单个WebView设置
在iOS9
,WKWebView
供googleplay安卓版下载应了Google一个十分快捷的特色去更改Usjava工作培训班er-Agent
,就是customUser浏览器的前史Agent
特色。这样运用起来不只便当,也不会全局更改User-Agent
,惋惜的是iOS9
才有,假设适配iOS8
,还是要运用上面的办httpclient法。
let webView = U长沙师范学院IWebView(frame: CGhttp://www.baidu.comRect.zero)
let userAgent = webView.stringByEvaluatingJavaScript(from: "navigator.userAgent")
i浏览器拜访过于频频不能用f let agent = userAgent {
let user = "@(ag浏览器怎么查看前史浏览记录ent)HTTP;extjava编译器ra_user_agent"
webView.customUserAgent = user
}
参看文章
WKWebView 那些坑