今天在写SDK的时候,需要显示网页页面,想都没有想直接WKWebView干上了,结果无语了,完成后无法加载显示,一直显示Error,搞了一上午,检查URL和加载过程,然而没有什么卵用。中午吃完饭回来想了一下,问问后台什么情况,他说在登录的时候会缓存一个Cookie,蒙了,百度,简书,总算找到出路了,下面来分享一下。
Cookie技术是客户端的解决方案,Cookie就是由服务器发给客户端的特殊信息,而这些信息以文本文件的方式存放在客户端,然后客户端每次向服务器发送请求的时候都会带上这些特殊的信息。当用户使用浏览器访问一个支持Cookie的网站的时候,用户会提供包括用户名在内的个人信息并且提交至服务器;接着,服务器在向客户端回传相应的超文本的同时也会发回这些个人信息,当然这些信息并不是存放在HTTP响应体(Response Body)中的,而是存放于HTTP响应头(Response Header);当客户端浏览器接收到来自服务器的响应之后,浏览器会将这些信息存放在一个统一的位置,自此,客户端再向服务器发送请求的时候,都会把相应的Cookie再次发回至服务器。而这次,Cookie信息则存放在HTTP请求头(Request Header)了。有了Cookie这样的技术实现,服务器在接收到来自客户端浏览器的请求之后,就能够通过分析存放于请求头的Cookie得到客户端特有的信息,从而动态生成与该客户端相对应的内容。
Web应用程序是使用HTTP协议传输数据的。HTTP协议是无状态的协议。一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接。这就意味着服务器无法从连接上跟踪会话。在一次网络请求之后,服务器就会断开与客户端的链接,下一次再请求的时候,服务器就不知道这次是谁请求的。而Cookie是这样的一种机制,它可以进行会话跟踪,弥补HTTP协议无状态的不足。在Session出现之前,基本上所有的网站都采用Cookie来跟踪会话。
我在这个SDK中,加载网页界面之前向服务器发送了一次登录请求,其中包含用户名,AppID,分区编号,大区编号等等,因为是登录游戏账号,所有有这么数据。在这次登录之后,在访问活动界面的时候,我没有再传递这些参数,我以为直接根据URL就能访问到,却是大错特错了,WKWebView的坑点就来了。
WKWebView实例不会把Cookie存入到App标准的的Cookie容器(NSHTTPCookieStorage)中,因为 NSURLSession/NSURLConnection等网络请求使用NSHTTPCookieStorage进行访问Cookie,所以不能访问WKWebView的Cookie,现象就是WKWebView存了Cookie,其他的网络类如NSURLSession/NSURLConnection却看不到。NSHTTPCookieStorage 是实现管理cookie的单利,每个cookie都是NSHTTPCookie类的实例,做为一个规则,cookie在所有应用 之间共享并在不同进程之间保持同步。与Cookie相同的情况就是WKWebView的缓存,凭据等。WKWebView都拥有自己的私有存储,因此和标准cocoa网络类兼容的不是那么好。这样WKWebView无法完成用户登录信息的保存,没办法,我只能换回UIWebView了,问题就解决了!
不过看到简书上还有其他的解决办法的,小弟只是初识,认识还不太深,如果有很好的解决方案,还希望大家能资源共享,谢谢!!!