html ua ios,iOS 修改webkit默认 UserAgent

转载 2017年08月02日 15:41:05

资料:

有个项目需求,要区分打开H5是在本地APP还是在手机浏览器,前端伙伴说需要配合修改默认的 UserAgent,以便区分。

UIWebView方式:

UIWebView*webView = [[UIWebViewalloc] initWithFrame:CGRectZero];NSString*userAgent = [webView stringByEvaluatingJavaScriptFromString:@"navigator.userAgent"];DLog(@"userAgent :%@", userAgent);

WKWebView方式:

// 注意这个方法是异步的WKWebView*wkWebView = [[WKWebViewalloc] initWithFrame:CGRectZero];[wkWebView evaluateJavaScript:@"navigator.userAgent"completionHandler:^(idresult,NSError*error) {    DLog(@"userAgent :%@", result); }];

默认UserAgent输出:

Mozilla/5.0 (iPhone; CPU iPhone OS 8_4 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Mobile/12H143

微信 iOS版的 :UserAgent

mozilla/5.0 (iphone; cpu iphone os 5_1_1 like mac os x) applewebkit/534.46 (khtml, like gecko) mobile/9b206 micromessenger/5.0

其中micromessenger就是自定义的

方案一,修改全局UserAgent值(这里是在原有基础上拼接自定义的字符串)- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions {

UIWebView*webView = [[UIWebViewalloc] initWithFrame:CGRectZero];NSString*userAgent = [webView stringByEvaluatingJavaScriptFromString:@"navigator.userAgent"];NSString*newUserAgent = [userAgent stringByAppendingString:@" native_iOS"];//自定义需要拼接的字符串NSDictionary*dictionary = [NSDictionarydictionaryWithObjectsAndKeys:newUserAgent,@"UserAgent",nil];    [[NSUserDefaultsstandardUserDefaults] registerDefaults:dictionary];

}

方案二,自定义UserAgent值WKWebView*wkWebView = [[WKWebViewalloc] initWithFrame:self.view.bounds];[self.view addSubview: wkWebView];NSString*customUserAgent =@"native_iOS";[[NSUserDefaultsstandardUserDefaults] registerDefaults:@{@"UserAgent":customUserAgent}];NSURL*url = [NSURLURLWithString:self.strUrl];NSURLRequest*request = [NSURLRequestrequestWithURL:url                                            cachePolicy:NSURLRequestUseProtocolCachePolicytimeoutInterval:10.f];[self.wkWebView loadRequest:request];

方案三self.wkWebView = [[WKWebViewalloc] initWithFrame:self.view.bounds]; __weaktypeof(self) weakSelf =self; [self.wkWebView evaluateJavaScript:@"navigator.userAgent"completionHandler:^(idresult,NSError*error) {        __strongtypeof(weakSelf) strongSelf = weakSelf;NSString*userAgent = result;NSString*newUserAgent = [userAgent stringByAppendingString:@" native_iOS"];NSDictionary*dictionary = [NSDictionarydictionaryWithObjectsAndKeys:newUserAgent,@"UserAgent",nil];        [[NSUserDefaultsstandardUserDefaults] registerDefaults:dictionary];// needs retain because `evaluateJavaScript:` is asynchronousstrongSelf.wkWebView = [[WKWebViewalloc] initWithFrame:strongSelf.view.bounds];  }];  [self.wkWebView loadRequest:request];

在测试的时候,发现方案二、三第一次运行的时候,还是显示默认的值,第二次才会显示自定义的值,其中原因还不明,如有朋友解决麻烦告诉一下,谢谢。

问题:实验的时候 工程中 只有方法一 是有效果的,方法二 三,没有产生作用。希望知道的小伙伴 给出答案

四:补充:实际应用

后期测试的时候 由于需求是根据请求后台的接口,来判断tabBarItem的个数和标题,还有加载的界面数据(我的工程是混合开发的,大部分是网页),后台需要在我请求的时候,传递UA头来判断版本 和返回的数据。而我使用上述第一种方式,可以修改成功,但是第一次请求这个接口的时候会被AFN 内部的UA 修改成默认格式的,

我定义的格式:Mozilla/5.0 (iPhone; CPU iPhone OS 11_2_6 like Mac OS X) AppleWebKit/604.5.6 (KHTML, like Gecko) Mobile/15D100 appName_ios_v2.0 appName_ios_v2.0

AFN请求之后,后台得到的格式:appName/2.0 (iPhone; iOS 11.2.6; Scale/2.00)

这样 后台得到的格式就和协商的格式不同了,然后经过实验呢,使用了AFN 中的AFHTTPSessionManager 类进行设置:

//重定义UA        创建 一个 AFHTTPSessionManager 类对象_sessionNSString *currentVision = [NSBundle mainBundle].infoDictionary[@"CFBundleShortVersionString"];

UIWebView *webView = [[UIWebView alloc] initWithFrame:CGRectZero];

NSString *userAgent = [webView stringByEvaluatingJavaScriptFromString:@"navigator.userAgent"];

NSString *newUserAgent = [userAgent stringByAppendingString:@" yuntuiapp_ios_v"];

newUserAgent = [newUserAgent stringByAppendingString:currentVision];

NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:newUserAgent, @"UserAgent", nil];

[[NSUserDefaults standardUserDefaults] registerDefaults:dictionary];

[[NSUserDefaults standardUserDefaults] synchronize];

[_session.requestSerializer setValue:newUserAgent forHTTPHeaderField:@"User-Agent"];

这样设置的话,在每次请求的时候 都会设定UA ,当然了,可能会有问题,但是具体的问题后期遇到再补充,暂时能满足需求。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值