iOS 修改默认 UserAgent

作者: 8870 | 来源:发表于2016-08-25 17:19 被阅读16502次
前言:

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

一、如何获取UserAgent

UIWebView方式:
UIWebView *webView = [[UIWebView alloc] initWithFrame:CGRectZero];
NSString *userAgent = [webView stringByEvaluatingJavaScriptFromString:@"navigator.userAgent"];
DLog(@"userAgent :%@", userAgent);
WKWebView方式:
// 注意这个方法是异步的
WKWebView *wkWebView = [[WKWebView alloc] initWithFrame:CGRectZero];
[wkWebView evaluateJavaScript:@"navigator.userAgent" completionHandler:^(id result, 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

方案一,修改全局UserAgent值(这里是在原有基础上拼接自定义的字符串)
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    UIWebView *webView = [[UIWebView alloc] initWithFrame:CGRectZero];
    NSString *userAgent = [webView stringByEvaluatingJavaScriptFromString:@"navigator.userAgent"];
    NSString *newUserAgent = [userAgent stringByAppendingString:@" native_iOS"];//自定义需要拼接的字符串
    NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:newUserAgent, @"UserAgent", nil];
    [[NSUserDefaults standardUserDefaults] registerDefaults:dictionary];
}
方案二,自定义UserAgent值
WKWebView *wkWebView = [[WKWebView alloc] initWithFrame:self.view.bounds];
[self.view addSubview: wkWebView];
NSString *customUserAgent = @"native_iOS";
[[NSUserDefaults standardUserDefaults] registerDefaults:@{@"UserAgent":customUserAgent}];
NSURL *url = [NSURL URLWithString:self.strUrl];
NSURLRequest *request = [NSURLRequest requestWithURL:url
                                             cachePolicy:NSURLRequestUseProtocolCachePolicy
                                         timeoutInterval:10.f];
[self.wkWebView loadRequest:request];
方案三
 self.wkWebView = [[WKWebView alloc] initWithFrame:self.view.bounds];
 __weak typeof(self) weakSelf = self;
 [self.wkWebView evaluateJavaScript:@"navigator.userAgent" completionHandler:^(id result, NSError *error) {
        __strong typeof(weakSelf) strongSelf = weakSelf;
        NSString *userAgent = result;
        NSString *newUserAgent = [userAgent stringByAppendingString:@" native_iOS"];
        NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:newUserAgent, @"UserAgent", nil];
        [[NSUserDefaults standardUserDefaults] registerDefaults:dictionary];
        // needs retain because `evaluateJavaScript:` is asynchronous
        strongSelf.wkWebView = [[WKWebView alloc] initWithFrame:strongSelf.view.bounds];
  }];
  [self.wkWebView loadRequest:request];

三、问题& 思考

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

相关文章

网友评论

  • 钱塘老酒酿:各位大佬有没有遇到过,wkWebView 设置了userAgent 之后,和js交互的代码就不会执行了的问题呀。
    不执行下面的代理。
    - (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message
  • Mcyboy007:目前采用的是第一种,iOS8后两种不知道解决方案。作者如果知道了请指教呀
    钱塘老酒酿:各位大佬有没有遇到过,wkWebView 设置了userAgent 之后,和js交互的代码就不会执行了的问题呀。
    不执行下面的代理。
    - (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message
    一骑红尘妃子叫:第一次还没有修改呢,加载完成才修改的,可以写在----> #import "AppDelegate.h" ----->didFinishLaunchingWithOptions的方法里,app启动的时候,先设置一下,然后再打开网页的时候,你就会看到User-Agent修改过了.
  • 静心_安神:ios 9以下,第二次才能用,这个缺陷太致命了
    你用什么新方法了吗
    一骑红尘妃子叫:第一次还没有修改呢,加载完成才修改的,可以写在----> #import "AppDelegate.h" ----->didFinishLaunchingWithOptions的方法里,app启动的时候,先设置一下,然后再打开网页的时候,你就会看到User-Agent修改过了.
  • 0668c9156f1e:需要在 [[NSUserDefaults standardUserDefaults] synchronize] 后面再加上 [self.wkWebView setCustomUserAgent:customUserAgent] , 你只是修改了本地的useragent , 没有修改网页的 ; 加上这个就对了
    笑红尘_e3ac:iOS 11.3不管用了
    0668c9156f1e:@进化中的程序猿 这就不得而知了 , 大兄弟
    进化中的程序猿:那么ios8 怎么办么
  • Monkey_hbh:楼主 你用方案三第一次能修改成功了么
    一骑红尘妃子叫:第一次还没有修改呢,加载完成才修改的,可以写在----> #import "AppDelegate.h" ----->didFinishLaunchingWithOptions的方法里,app启动的时候,先设置一下,然后再打开网页的时候,你就会看到User-Agent修改过了.
  • 爱阿爸的阿龙龙:刚用到 , 谢谢楼主分享!

  • VenpleD:因为你少写一句话[[NSUserDefaults standardUserDefaults] synchronize];userAgent写入默认是异步的
    DCherry:有个奇怪的问题 我在方法里声明方法变量 wkwebivew 取不到 userAgent 要声明成属性才能取到? 求为什么
    DCherry:@BlueWorld 请问下 严谨的该怎么写 我在注册前和注册后写都是可以的, 设置完同步之后 需要再改回异步嘛?怎么改回异步呢?
    DCherry:@BlueWorld 历害了 BlueWorld 哥
  • 青鸟evergreen:因为是先加载的网页然后才更改的useragent的
    是因_也是果:@青鸟evergreen 这样也不行,还有其他方法吗?
    青鸟evergreen:@Auditore 在viewDidload中更改useragent,在viewDidAppear中再加载网页
    Auditore:那有解决办法吗?加上[[NSUserDefaults standardUserDefaults] synchronize];同样需要第二次进入才能修改user agent
  • z时光旅人:iOS8上WKWebView修改User Agent的方法无效
  • F森:你好,请问userAgent涉及到私有API吗,有没有版本的限制,还有就是获取userAgent已经运用到项目里面,并上线了吗? 谢谢~
    F森:谢谢回复:+1:
    8870:@F森 这里没有涉及到私有API,可以放心使用,我这里最终没有这么用,因为需求变了
  • 马铃薯蜀黍:排版很赞

本文标题:iOS 修改默认 UserAgent

本文链接:https://www.haomeiwen.com/subject/mxrasttx.html