設置全局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