WKWebView使用遇到的问题与解决办法

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 {
    
    //取出cookie
    NSHTTPCookieStorage *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];
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值