文章目录
WKWebView的简单使用
加载
WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
config.userContentController = [[WKUserContentController alloc] init];
self.webView = [[WKWebView alloc] initWithFrame:CGRectMake(0, 20, CGRectGetWidth(self.view.frame), CGRectGetHeight(self.view.frame)-20) configuration:config];
self.webView.UIDelegate = self;
self.webView.navigationDelegate = self;
self.webView.allowsBackForwardNavigationGestures = YES;
if(self.userAgent.length>0)
self.webView.customUserAgent = self.userAgent;
else
self.webView.customUserAgent = @"Mozilla/5.0 (iPhone; CPU iPhone OS 12_1_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/16D57 iphonevhallclass";
//加载网页
NSURLRequest *request = [NSURLRequest requestWithURL:self.webURL];
[self.webView loadRequest:request];
[self.view addSubview:self.webView];
//添加
self.loadingView.frame = self.webView.bounds;
[self.webView addSubview:self.loadingView];
注册ScriptMessageHandler
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[self.webView.configuration.userContentController addScriptMessageHandler:self name:kWebMessageHandlerName];
if([UIDevice currentDevice].systemVersion.floatValue<10.0)
[self.webView reload];
}
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
[self.webView.configuration.userContentController removeScriptMessageHandlerForName:kWebMessageHandlerName];
}
回调
WKNavigationDelegate
- (void)webView:(WKWebView *)webView didFailNavigation:(null_unspecified WKNavigation *)navigation withError:(NSError *)error
{
NSLog(@"webView load error : %@",error);
[self.loadingView stopAnimating];
[OSWebHelper removeCache];
[self goBackAction];
}
- (void)webView:(WKWebView *)webView didFailProvisionalNavigation:(null_unspecified WKNavigation *)navigation withError:(NSError *)error
{
NSLog(@"webView load error1 : %@",error);
[self.loadingView stopAnimating];
[OSWebHelper removeCache];
[self goBackAction];
}
- (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(null_unspecified WKNavigation *)navigation
{
NSLog(@"webView start loading");
[self.loadingView startAnimating];
}
- (void)webView:(WKWebView *)webView didFinishNavigation:(null_unspecified WKNavigation *)navigation
{
NSLog(@"webView load finished");
if(!webView.isLoading)
{
[self.loadingView stopAnimating];
}
}
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(nonnull WKNavigationAction *)navigationAction decisionHandler:(nonnull void (^)(WKNavigationActionPolicy))decisionHandler
{
decisionHandler(WKNavigationActionPolicyAllow);
}
WKScriptMessageHandler
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message
{
NSLog(@"didReceiveScriptMessage %@",message.body);
if ([message.name isEqualToString:kWebMessageHandlerName])
{
NSDictionary *dict = [OSWebHelper jsonStringToDictionary:message.body];
if (dict) {
NSString *type = dict[@"type"];
if ([type isEqualToString:kWebMessageType_xxx])
{
}
else if ([type isEqualToString:kWebMessageType_xxx])
{
}
else if ([type isEqualToString:kWebMessageType_xxx])
{
}
}
}
}
缓存
+ (void)removeCache {
if ([[UIDevice currentDevice].systemVersion floatValue] >= 9.0) {
// NSSet *websiteDataTypes
//
// = [NSSet setWithArray:@[
//
// WKWebsiteDataTypeDiskCache,
//
// WKWebsiteDataTypeOfflineWebApplicationCache,
//
// WKWebsiteDataTypeMemoryCache,
//
// WKWebsiteDataTypeLocalStorage,
//
// WKWebsiteDataTypeCookies,
//
// WKWebsiteDataTypeSessionStorage,
//
// WKWebsiteDataTypeIndexedDBDatabases,
//
// WKWebsiteDataTypeWebSQLDatabases
//
// ]];
//// All kinds of data
NSSet *websiteDataTypes = [WKWebsiteDataStore allWebsiteDataTypes];
//// Date from
NSDate *dateFrom = [NSDate dateWithTimeIntervalSince1970:0];
//// Execute
[[WKWebsiteDataStore defaultDataStore] removeDataOfTypes:websiteDataTypes modifiedSince:dateFrom completionHandler:^{
// Done
}];
} else {
NSString *libraryPath = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *cookiesFolderPath = [libraryPath stringByAppendingString:@"/Cookies"];
NSError *errors;
[[NSFileManager defaultManager] removeItemAtPath:cookiesFolderPath error:&errors];
}
}
userAgent
webView加载出来之后才能获取到userAgent,可以提前获取,传到当前页面。
#pragma mark - getUserAgent
- (void)getUserAgent{
self.webView= [[WKWebView alloc] init];
self.webView.navigationDelegate = self;
//加载网页
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:xxx]];
[self.webView loadRequest:request];
}
- (void)webView:(WKWebView *)webView didFinishNavigation:(null_unspecified WKNavigation *)navigation{
__weak typeof(self)wf = self;
[self.webView evaluateJavaScript:@"navigator.userAgent" completionHandler:^(id _Nullable result, NSError * _Nullable error) {
wf.userAgent = [NSString stringWithFormat:@"%@ iphonevhallclass",result];
NSLog(@"customUserAgent : %@",wf.userAgent);
wf.webView = nil;
}];
}
可在获取到的userAgent后面追加字符串,一般的js可以根据追加的字符串来判断是iOS还是安卓等。