WKWebView的一些小问题

一:用户的登录问题

描述:即如何记录用户的登录信息。比如,一个纯webview组成的app,没有原生登录。

方案1:使用cookie。cookie可看作是服务器端记录浏览器端的标示,可作为临时或持久的标记。它以key-value的形式存储,比如可以存储用户名。

        在请求一个网址时,可以从网址的头中获取到传来的cookie,然后我们可以根据需要存储cookie,下次进行请求时带上cookie返回给网站端,网站端处理后返回新的cookie回来。此时可以做一些操作:比如网站根据cookie决定此用户是否因为过期或其他需要重新登录。如果登录了,则网站端记录此cooki的登录状态,客户端下次再拿此cookie请求此网站则可以直接登录。

        所以,我们可以用cookie来实现wkwebview记录用户登录状态。当然,uiwebview时代cookie可以自动被存储和上传,但是在wkwebview时代就需要自己记录并在打开网址时带上cookie了(看需求)。wkwebview的有自己的cookie管理方式,还需要再去研究。

方案2:通过js与oc的交互,实现原生记录用户的登录或退出状态,设置过期时间或其他。在请求URL时,请求完成后注入js代码,传入本地用户数据到js中,js做相应的处理逻辑。js处理后,调用oc方法记录操作后的用户信息。

二:原生与JS交互的问题

描述:有经验的JS开发人员肯定有旧时的UIWebView那种交互经验,如果你弃用了UIwebview,选择使用了wkwebview,那可能刚开始两端交互的时候会造成一点误解。因为安卓端跟iOS端的UIwebview的JS处理方式很像,后台可以用一种方案,这在以前没有问题。但是WKwebview不接受这种方式,需要单独做处理。因为它不支持以前的直接获取网页上下文、通过javascriptCore的方式。

        UIwebview时代常用拦截请求URL或者实现javascriptCore库里的方法去做原生与JS的交互,但是wkwebview则没办法使用javascriptCore了,只能使用wk自有的方式去做交互。如果要JS想在任意时候主动调用客户端方法,而不仅仅是客户端主动去调用js方法,则用下面这种方式:

js端需要使用postmessage的方式去调用方法(假设调用对象名字为a),然后定义一个跟原生交互的方法(sel2),OC这边则需要在wkwebview这边注册a,在WKScriptMessageHandler方法里去判断是否是a,如果是,则去evaluateJS的方法sel2,用来调用JS方法或传值给JS。当然,为了区分uiwebview和wkwebview(安卓或iOS),JS端可以增加一个需要传入是否是wkwebview的一个方法,客户端在加载完成的时候主动去调用,告诉JS需要用哪种函数调用方式。


三:缓存问题

有时候我们需要保持页面为最新状态,所以就不需要缓存。解决办法是在- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation 中移除之前的缓存(iOS9.0+)。

NSSet *websiteDataTypes = [[NSSet alloc] initWithObjects:WKWebsiteDataTypeDiskCache,WKWebsiteDataTypeMemoryCache, nil];
    [[WKWebsiteDataStore defaultDataStore] removeDataOfTypes:websiteDataTypes modifiedSince:[NSDate dateWithTimeIntervalSince1970:0] completionHandler:^{
//        Toast(@"缓存已清除");
    }];

你可能感兴趣的:(WKWebView的一些小问题)