WKWebView获取UA以及更改UA的坑

最近有webView的相关需求,需要更改UA来适应我们的前端,但是又得保留原本的UA,所以不能直接覆盖,得追加字段,这个过程中WKWebView坑就比较多,列数一下。

UIWebView更改UA

UIWebView *webview = [[UIWebView alloc] initWithFrame:CGRectZero];
    NSString *ua = [webview stringByEvaluatingJavaScriptFromString:@"navigator.userAgent"];
    if (ua) {
        NSArray *uaComps = [ua componentsSeparatedByString:@" "];
        if ([uaComps containsObject:@"Marble"] == NO) {
            ua = [ua stringByAppendingString:@" Marble"];
            [[NSUserDefaults standardUserDefaults] registerDefaults:@{@"UserAgent": ua}];
            [[NSUserDefaults standardUserDefaults] synchronize];
        }
    }

UIWebView很简单就处理完毕,坑多的是WK。

WKWebView

先上完整版:

    _webview = [[WKWebView alloc] init];
    
    NSURLRequest *request = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:@"www.allhistory.com"] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10];
    [_webview loadRequest:request];
    [_webview evaluateJavaScript:@"navigator.userAgent" completionHandler:^(id result, NSError *error) {
        NSString *userAgent = result;
        NSArray *stringArray = [userAgent componentsSeparatedByString:@" "];
        if ([stringArray containsObject:@" marble"]) {
            return;
        }
        NSString *newUserAgent = [userAgent stringByAppendingString:@" marble"];
        NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:newUserAgent, @"UserAgent", nil];
        [[NSUserDefaults standardUserDefaults] registerDefaults:dictionary];
        [[NSUserDefaults standardUserDefaults] synchronize];
    }];

坑:
1、wkwebview必须要先loadrequest,才能获取和设置成功;
2、由于获取是异步的,所以得持有这个webview,不然过了这个方法的生命周期,webview就被释放了,取到的resultnil。所以把webview作为属性持有起来;
3、最后设置完毕别忘了synchronize同步一下。

你可能感兴趣的:(WKWebView获取UA以及更改UA的坑)