WKWebView遇到的问题

参考链接:

http://www.jianshu.com/p/403853b63537

http://www.jianshu.com/p/186a3b236bc9

1. 用WKwebView时,怎么通过post传数据给服务器

当我们用UIWebView时,如果要post数据给服务器,那代码很简单,如下

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:Message_Login_path]];

[request setHTTPMethod:@"POST"];

[request setHTTPBody:[body dataUsingEncoding:NSUTF8StringEncoding]];

[weakSelf.webView loadRequest:request];

但是我们用WKWebView时,再通过上面的代码就无法将参数传过去,网上找到了一种方法

1.创建JSPOST.html文件,把下列代码复制过去

2.将对应的JavaScript代码通过加载本地网页的形式加载到WKWebView(我是在登录时需要post数据过去验证,所以,下面的代码是在将要push到登录页面前,加载js)

// 获取JS所在的路径

NSString *path = [[NSBundle mainBundle] pathForResource:@"JSPOST" ofType:@"html"];

// 获得html内容

NSString *htmlJS = [[NSString alloc] initWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];

// 加载js

[self.wkWebView loadHTMLString:htmlJS baseURL:nil];

// JS发送POST的Flag,为真的时候会调用JS的POST方法

self.needLoadJSPOST = YES;

3.post提交数据并更改self.needLoadJSPOST=NO,避免重复调用。

//post的数据,注意数据格式(可以将上面的JSPOST.html里的代码给服务器人员,确定下要传过去的格式是什么样的,并且确定服务器那边是否需要特殊处理这些数据)

NSString *postData = self.wkPostData;

//post的路径

NSString *urlStr = Message_Login_path;

NSString *jscript = [NSString stringWithFormat:@"post('%@', %@);",urlStr,postData];

[self.wkWebView evaluateJavaScript:jscript completionHandler:^(id _Nullable object, NSError * _Nullable error) {

self.wkPostData = nil;

NSLog(@"%@",object);

NSLog(@"error=%@",error);

}];


2.wkwebview加载h5要调用电话功能和APPStore

UIWebview 调用电话或者APPStore无需做其他处理,但是WKWebVIew不做处理就不可以

//调用电话

- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler

{

NSURL *url = navigationAction.request.URL;

if ([url.scheme isEqualToString:@"tel"]) {

UIApplication *app = [UIApplication sharedApplication];

if ([app canOpenURL:url]) {

[app openURL:url];

decisionHandler(WKNavigationActionPolicyCancel);

return;

}

}

}

//APPStore

if ([url.absoluteString containsString:@"itunes.apple.com"]) {

if ([app canOpenURL:url])

{

[app openURL:url];

decisionHandler(WKNavigationActionPolicyCancel);

}

}

3.清理缓存

由于修改默写页面的数据时,需要回调到先前的某些来显示,这时由于缓存存在,导致显示的页面里还是显示前些的数据,无法更新到最新的H5页面。可以通过清理缓存来实现获取最新的H5页面

UIWebView清理缓存:

通过调用一下代码就可以清理缓存

[[NSURLCache sharedURLCache] removeAllCachedResponses];

我们想清理缓存更新H5页面,仅仅是想清除某个H5页面缓存,先前有试过针对某个页面进行清除,但是一直不成功,无奈只能清除所有的内存来达到目的。

WKWebView清理缓存:

WkWebView是IOS8出现的,但不是很完善,例如设置Agent的customUserAgent属性和清理缓存的方法等等都是IOS9才出现的,因为项目中有用到,所以我是适配IOS9才用wkwebview。

网上清理缓存的方法是

NSSet *websiteDataTypes

= [NSSet setWithArray:@[

WKWebsiteDataTypeDiskCache,

WKWebsiteDataTypeMemoryCache

]];

NSDate *dateFrom = [NSDate dateWithTimeIntervalSince1970:0];

// Execute

[[WKWebsiteDataStore defaultDataStore] removeDataOf  Types:websiteDataTypes  modifiedSince:dateFrom completionHandler:^{

}];

其中websiteDataTypes存放的是要清除的类型,也可以通过 NSSet *websiteDataTypes = [WKWebsiteDataStore allWebsiteDataTypes];清除全部的缓存类型。

通过这个方法我百试百错, 我先前一直是放在- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler 中执行。后来改成放在

- (void)webView:(WKWebView *)webView didFinishNavigation:(null_unspecified WKNavigation *)navigation 中就成功了 。

你可能感兴趣的:(WKWebView遇到的问题)