參考鏈接:
http://www.reibang.com/p/403853b63537
http://www.reibang.com/p/186a3b236bc9
1. 用WKwebView時(shí)递惋,怎么通過post傳數(shù)據(jù)給服務(wù)器
當(dāng)我們用UIWebView時(shí),如果要post數(shù)據(jù)給服務(wù)器继低,那代碼很簡單,如下
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:Message_Login_path]];
[request setHTTPMethod:@"POST"];
[request setHTTPBody:[body dataUsingEncoding:NSUTF8StringEncoding]];
[weakSelf.webView loadRequest:request];
但是我們用WKWebView時(shí),再通過上面的代碼就無法將參數(shù)傳過去泵琳,網(wǎng)上找到了一種方法
1.創(chuàng)建JSPOST.html文件,把下列代碼復(fù)制過去
2.將對(duì)應(yīng)的JavaScript代碼通過加載本地網(wǎng)頁的形式加載到WKWebView(我是在登錄時(shí)需要post數(shù)據(jù)過去驗(yàn)證誊役,所以获列,下面的代碼是在將要push到登錄頁面前,加載js)
// 獲取JS所在的路徑
NSString *path = [[NSBundle mainBundle] pathForResource:@"JSPOST" ofType:@"html"];
// 獲得html內(nèi)容
NSString *htmlJS = [[NSString alloc] initWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
// 加載js
[self.wkWebView loadHTMLString:htmlJS baseURL:nil];
// JS發(fā)送POST的Flag蛔垢,為真的時(shí)候會(huì)調(diào)用JS的POST方法
self.needLoadJSPOST = YES;
3.post提交數(shù)據(jù)并更改self.needLoadJSPOST=NO击孩,避免重復(fù)調(diào)用。
//post的數(shù)據(jù)鹏漆,注意數(shù)據(jù)格式(可以將上面的JSPOST.html里的代碼給服務(wù)器人員巩梢,確定下要傳過去的格式是什么樣的,并且確定服務(wù)器那邊是否需要特殊處理這些數(shù)據(jù))
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要調(diào)用電話功能和APPStore
UIWebview 調(diào)用電話或者APPStore無需做其他處理艺玲,但是WKWebVIew不做處理就不可以
//調(diào)用電話
- (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.清理緩存
由于修改默寫頁面的數(shù)據(jù)時(shí)且改,需要回調(diào)到先前的某些來顯示,這時(shí)由于緩存存在板驳,導(dǎo)致顯示的頁面里還是顯示前些的數(shù)據(jù)又跛,無法更新到最新的H5頁面∪糁危可以通過清理緩存來實(shí)現(xiàn)獲取最新的H5頁面
UIWebView清理緩存:
通過調(diào)用一下代碼就可以清理緩存
[[NSURLCache sharedURLCache] removeAllCachedResponses];
我們想清理緩存更新H5頁面慨蓝,僅僅是想清除某個(gè)H5頁面緩存感混,先前有試過針對(duì)某個(gè)頁面進(jìn)行清除,但是一直不成功礼烈,無奈只能清除所有的內(nèi)存來達(dá)到目的弧满。
WKWebView清理緩存:
WkWebView是IOS8出現(xiàn)的,但不是很完善此熬,例如設(shè)置Agent的customUserAgent屬性和清理緩存的方法等等都是IOS9才出現(xiàn)的庭呜,因?yàn)轫?xiàng)目中有用到,所以我是適配IOS9才用wkwebview犀忱。
網(wǎng)上清理緩存的方法是
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];清除全部的緩存類型。
通過這個(gè)方法我百試百錯(cuò)阴汇, 我先前一直是放在- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler 中執(zhí)行数冬。后來改成放在
- (void)webView:(WKWebView *)webView didFinishNavigation:(null_unspecified WKNavigation *)navigation 中就成功了 。