前言
在开发项目当中,由于有第三方SDK的需求又或者是项目服务端要求需要更改系统User-Agent的情况,应用中,对于一些H5需要使用添加个性化信息后的User-Agent,而另一些H5不希望使用更改后的User-Agent,所以本文将从H5应用中简单介绍一下。
通过本文你将了解到:
1.什么是User-Agent
2.如何获取User-Agent
3.如何添加自定义信息和修改User-Agent
4.项目中使用User-Agent总结
1.什么是User-Agent
User-Agent中文名为用户代理,简称UA,它是一个特殊的字符串头,是的服务器能够识别客户使用的操作系统及版本,CPU类型,浏览器及版本,浏览器语言等。
这里我贴一下我自己手机的User-Agent:
Mozilla/5.0 (iPhone; CPU iPhone OS 13_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148
2.如何获取User-Agent
苹果即将在2020年12月31号全面禁止使用UIWebView,所以本文仅对UIWebView获取User-Agent做简单介绍.
2.1 UIWebVeiw获取
UIWebView为同步的方式,可以直接获取到User-Agent。
UIWebView *webView = [[UIWebView alloc] initWithFrame:CGRectZero];
self.userAgent = [webView stringByEvaluatingJavaScriptFromString:@"navigator.userAgent"] ?:@"";
2.2WKWebView获取
WKWebView获取User-Agent为异步方式,所以如果需要在应用启动就要使用User-Agent的话,需要做好相应的处理。
WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
if (@available(iOS 13.0, *)) {
config.defaultWebpagePreferences.preferredContentMode = WKContentModeMobile;
}
WKWebView *webView = [[WKWebView alloc] initWithFrame:CGRectZero configuration:config];
[webView evaluateJavaScript:@"navigator.userAgent" completionHandler:^(id _Nullable response, NSError *_Nullable error) {
self.userAgent = (NSString *)response;
}];
3.如何添加自定义信息和修改User-Agent
获取到系统的User-Agent(通过上述方法获取到的UA都是系统最新的,假如在某一个刻修改过,这里获取到的也是修改过的UA,除非重新启动程序),进行字符串操作添加上自定义信息然后重新写进系统,这样就达到了更改默认UA的目的。
- (NSString *)addExtraMsgForUserAgent:(NSString *)userAgent{
NSString *userAgent_old = self.userAgent;
NSString *userAgent_new = userAgent_old;
if ([userAgent_old rangeOfString:@"app_version"].location == NSNotFound) {
userAgent_new = [userAgent_old stringByAppendingFormat:@" app_version/iOS/%@",[NSString getAppVersion]];
}
return userAgent_new;
}
3.1修改全局系统User-Agent
修改全局系统User-Agent的生命周期会随着程序的生命周期,程序一旦杀死更改的User-Agent也会随即消失,如果希望保持更改User-Agent,则需要在每次应用启动时重新更改系统User-Agent
- (void)updateSystemUserAgent:(NSString *)userAgent{
[[NSUserDefaults standardUserDefaults] registerDefaults:@{@"UserAgent":userAgent}];
[[NSUserDefaults standardUserDefaults] synchronize];
}
3.2修改局部User-Agent
修改局部User-Agent的生命周期仅限在当前的WebView的生命周期内,一旦WebView销毁,更改的User-Agent信息就会随机消失。
- (void)updateCustomUserAgent:(NSString *)userAgent{
[self.wkWebView setCustomUserAgent:userAgent];
}
4.项目中使用User-Agent总结
由于苹果即将全面废弃UIWebView,以下总结仅针对WKWebView。
1.WKWebView获取系统UA为异步方式,如果遇到多个SDK以及App自己修改UA,需要有序进行修改,并且在之前更新过的UA中添加新的信息,而不是直接更改。
2.当系统仅需修改某一个h5页面的UA时,修改UA一定要在WKWebView初始化后,在发出请求前设置好,否则会导致修改失败。