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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章