参考链接:
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 中就成功了 。