设置全局userAgent,设置局部userAgent,能否根据userAgent区分当前app web所用的容器,H5做不同的兼容.这里来讲讲.
首先通过WKWebView全局设置userAgent,因为9.0 才有customUserAgent,所以要兼容9.0以下,同时 因为iOS 12.0的 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 第一次无效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