WKWebView的代理方法很多,具体怎么用,这些很容就能找到很多介绍资料。
问题1:js调用原生的方法。
如果是alert,confirm,prompt这些的话,js直接调用他们的方法,wkwebView可以拦截并在
WKUIDelegate的代理方法中我们可以用原生的控件做出我们需要的操作,并且可以把结果通过handle返回给js。
如果是其他的一些方法,我们可以在初始化WKWebView的时候,在configuration中这样配置,
[configuration.userContentController addScriptMessageHandler:self name:@"IOSBridge"];
然后在
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message{
//在这里可以根据message中的信息来调用需要调用的方法
}
问题1:cookie的设置。
wkwebview 和http不共享cookie,所以在请求的时候拿不到cookie!
所以在loadRequset的时候需要给请求设置cookie{NSMutableURLRequest *requestNew = [NSMutableURLRequest requestWithURL:request.URL];[requestNew addValue:[YZTWebView readCurrentCookie:request.URL] forHTTPHeaderField:@"Cookie"];return [(WKWebView *)self.realWebView loadRequest:requestNew];}但是cookie只会设置一次,假如网页间的跳转用到了ajax,这样cookie就会失效,需要需要在wk的didFinishNavigation方法中手动编写js代码去设置cookie!还需要注意的问题就是js写的cookie需要设定path。path不同的话cookie也设置不了!/*** wkwebview 加载完成*/- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation {//取出cookieNSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage];//js函数NSString *JSFuncString =@"function setCookie(name,value,expires)\{\var oDate=new Date();\oDate.setDate(oDate.getDate()+expires);\document.cookie=name+'='+value+';expires='+oDate+';path=/'\}\function getCookie(name)\{\var arr = document.cookie.match(new RegExp('(^| )'+name+'=([^;]*)(;|$)'));\if(arr != null) return unescape(arr[2]); return null;\}\function delCookie(name)\{\var exp = new Date();\exp.setTime(exp.getTime() - 1);\var cval=getCookie(name);\if(cval!=null) document.cookie= name + '='+cval+';expires='+exp.toGMTString();\}";//拼凑js字符串NSMutableString *JSCookieString = JSFuncString.mutableCopy;for (NSHTTPCookie *cookie in cookieStorage.cookies) {NSString *excuteJSString = [NSString stringWithFormat:@"setCookie('%@', '%@', 1);", cookie.name, cookie.value];[JSCookieString appendString:excuteJSString];}//执行js[webView evaluateJavaScript:JSCookieString completionHandler:nil];[self callback_webViewDidFinishLoad];}