WKWebView的简单使用

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还是安卓等。

发布了131 篇原创文章 · 获赞 9 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/Morris_/article/details/102957869