WKWebView 和UIWebView userAgent 全局设置和局部设置 9.0 12.0 兼容性问题

       设置全局userAgent,设置局部userAgent,能否根据userAgent区分当前app web所用的容器,H5做不同的兼容.这里来讲讲.

首先通过WKWebView全局设置userAgent,因为9.0 才有customUserAgent,所以要兼容9.0以下,同时 因为iOS 12.0的 ua是异步所以第一次拿不到,我们需要这样设置

全局设置ua

WKWebView *webView = [[WKWebView alloc] init];

    if (@available(iOS 12.0, *)){

                   NSString *baseAgent = [webView valueForKey:@"applicationNameForUserAgent"];

                  NSString *userAgent = [NSString stringWithFormat:@"%@ %@",baseAgent,kCompanyUserAgent];

                  [webView setValue:userAgent forKey:@"applicationNameForUserAgent"];

                  NSDictionary * dictionnary = [[NSDictionary alloc] initWithObjectsAndKeys:userAgent, @"UserAgent", nil];

                  [[NSUserDefaults standardUserDefaults] registerDefaults:dictionnary];

                  [[NSUserDefaults standardUserDefaults] synchronize];

              }

    [webView evaluateJavaScript:@"navigator.userAgent" completionHandler:^(id _Nullable result, NSError * _Nullable error) {

           NSString *wkNewAgent = [NSString stringWithFormat:@"%@",result]; // 直接获取为nil

              wkNewAgent = [NSString stringWithFormat:@"%@  %@ ",result,kCompanyUserAgent];

          

           if (@available(iOS 9.0, *)) {

               webView.customUserAgent = wkNewAgent;

           }else{

               NSDictionary * dictionnary = [[NSDictionary alloc] initWithObjectsAndKeys:wkNewAgent, @"UserAgent", nil];

               [[NSUserDefaults standardUserDefaults] registerDefaults:dictionnary];

               [[NSUserDefaults standardUserDefaults] synchronize];

               [webView setValue:wkNewAgent forKey:@"applicationNameForUserAgent"];

           }

       }];

然后我们进入UIWebView 看看ua,和全局设置一致,但是我们发现一个问题.

12.0 [webView valueForKey:@"applicationNameForUserAgent"]

拿不到正确Mozilla/5.0什么的ua,只有个类似"Mobile/12A365".而下面全局设置evaluateJavaScript里,虽然能拿到正确的ua但是设置无效,是上面的设置起作用.

进入WKWebView 容器看看ua,抱歉 [webView valueForKey:@"applicationNameForUserAgent"]取不到,evaluateJavaScript能取到全局

局部设置ua

     和上面一样代码,但是发现一个问题,这里设置局部ua 第一次无效applicationNameForUserAgent和evaluateJavaScript 都无效

删除evaluateJavaScript,发现设置起作用,局部第一次能看到了.然后回去UIWebView看下是否有影响,发现也变成WK设置的.

最后发现

NSDictionary * dictionnary = [[NSDictionary alloc] initWithObjectsAndKeys:userAgent, @"UserAgent", nil];

 [[NSUserDefaults standardUserDefaults] registerDefaults:dictionnary];

 [[NSUserDefaults standardUserDefaults] synchronize];

这个api的作用是设置了全局的ua,然后果断删除,局部设置ua成功

如果要设置局部ua形式为全局+局部,那怎么处理.12.0局部里肯定是拿不到.最好外面传进来全局.12.0 以外的没问题.

回到全局设置ua问题上,12.0的applicationNameForUserAgent 获取不到正确ua,evaluateJavaScript能获取正确ua,但是又设置不上.

那么UIWebView设置全局ua呢,试了下,很显然没毛病.所以目前全局ua设置建议UIWeb 设置下,要么你WK设置12.0 自己写一个ua塞进去.(UIWeb获取正确的塞WK没必要,还不如直接UIWebView设置).

好,有这些我们能做什么呢

app你有几套hybrid框架的时候,线上哪套hybrid框架有问题可以路由来回切web容器达到切hybrid框架目的,h5可以根据你容器ua来区分兼容不同hybrid框架.而不是根据死版本来配置.这样h5可以灵活发版,app里也可以灵活切hybrid可以保证app线上无bug

 

你可能感兴趣的:(iOS开发)