iOS UIWebView 自定义 UserAgent
2016-04-01 10:31
387 查看
我的需求是:用户使用我的浏览器浏览网页,服务器可以得到我的浏览器名称和版本号,站长工具能查看到客户端来源。OK,解决思路就是修改系统默认的用户代理UserAgent,这是没差的。
曾经做过的App也有这样的需求,思路是在UIWebView 的 Request 的 Header 中设置 UserAgent,最后证实这条思路是行不通的,后来由于时间问题,这个功能就放弃了。如今有个App又有这个需求,看到UC浏览器设置中有个UA设置,让我很是羡慕,果然愿意解决问题的人总是幸运的,再网上找到相关文章。了解大概两种思路,第一种是使用私有API,第二种则是iOS SDK内的。第一种这里就放弃不讲了,只能上第二种实现思路。
// 获取 iOS 默认的 UserAgent,可以很巧妙地创建一个空的UIWebView来获取:
NSString *userAgent = [[[UIWebView alloc] init] stringByEvaluatingJavaScriptFromString:@"navigator.userAgent"];
// 获取App名称,我的App有本地化支持,所以是如下的写法
NSString *appName = NSLocalizedStringFromTable(@"CFBundleDisplayName", @"InfoPlist", nil);
// 如果不需要本地化的App名称,可以使用下面这句
// NSString * appName = [[NSBundle mainBundle] infoDictionary][@"CFBundleDisplayName"];
NSString *version = [[NSBundle mainBundle] infoDictionary][@"CFBundleShortVersionString"];
NSString *customUserAgent = [userAgent stringByAppendingFormat:@"
%@/%@", appName, version];
[[NSUserDefaults standardUserDefaults] registerDefaults:@{@"UserAgent":customUserAgent}];
// ---------- 随便写个测试代码,记得设置 delegate哦,这只是测试代码
UIWebView *webView = [[UIWebView alloc] init];
webView.delegate = self;
[webView loadRequest:[NSURLRequest requestWithURL:[NSURLURLWithString:@"http://www.baidu.com/"]]];
- (void)webViewDidFinishLoad:(UIWebView *)webView
{
NSLog(@"UserAgent
= %@", [webView stringByEvaluatingJavaScriptFromString:@"navigator.userAgent"]);
}
Xcode 5.1.1 iOS 7.1 模拟器下得到的结果是:
Mozilla/5.0 (iPhone; CPU iPhone OS 7_1 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) 中华浏览器/1.2.2
曾经做过的App也有这样的需求,思路是在UIWebView 的 Request 的 Header 中设置 UserAgent,最后证实这条思路是行不通的,后来由于时间问题,这个功能就放弃了。如今有个App又有这个需求,看到UC浏览器设置中有个UA设置,让我很是羡慕,果然愿意解决问题的人总是幸运的,再网上找到相关文章。了解大概两种思路,第一种是使用私有API,第二种则是iOS SDK内的。第一种这里就放弃不讲了,只能上第二种实现思路。
// 获取 iOS 默认的 UserAgent,可以很巧妙地创建一个空的UIWebView来获取:
NSString *userAgent = [[[UIWebView alloc] init] stringByEvaluatingJavaScriptFromString:@"navigator.userAgent"];
// 获取App名称,我的App有本地化支持,所以是如下的写法
NSString *appName = NSLocalizedStringFromTable(@"CFBundleDisplayName", @"InfoPlist", nil);
// 如果不需要本地化的App名称,可以使用下面这句
// NSString * appName = [[NSBundle mainBundle] infoDictionary][@"CFBundleDisplayName"];
NSString *version = [[NSBundle mainBundle] infoDictionary][@"CFBundleShortVersionString"];
NSString *customUserAgent = [userAgent stringByAppendingFormat:@"
%@/%@", appName, version];
[[NSUserDefaults standardUserDefaults] registerDefaults:@{@"UserAgent":customUserAgent}];
// ---------- 随便写个测试代码,记得设置 delegate哦,这只是测试代码
UIWebView *webView = [[UIWebView alloc] init];
webView.delegate = self;
[webView loadRequest:[NSURLRequest requestWithURL:[NSURLURLWithString:@"http://www.baidu.com/"]]];
- (void)webViewDidFinishLoad:(UIWebView *)webView
{
NSLog(@"UserAgent
= %@", [webView stringByEvaluatingJavaScriptFromString:@"navigator.userAgent"]);
}
Xcode 5.1.1 iOS 7.1 模拟器下得到的结果是:
Mozilla/5.0 (iPhone; CPU iPhone OS 7_1 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) 中华浏览器/1.2.2
相关文章推荐
- Android Studio简单介绍与使用
- iOS开发之--- NSURLProtocol
- Android 65k 问题
- Android中FragmentTabHost结合fragment实现选项卡功能
- ViewPage,TabHost与Fragment(上)
- Android 退出应用程序问题
- iOS锁屏问题解决方式
- 微信支付
- E/AndroidRuntime: java.lang.IllegalStateException: Recursive entry to executePendingTransactions
- Android蓝牙3.0和4.0开发记录
- Android视图绘制流程完全解析,带你一步步深入了解View(二)
- web前端 —— 移动端知识的一些总结
- android Matrix
- Android定时服务
- Routable-iOS
- AMS管理android四大组件
- Android SystemProperties设置/取得系统属性的用法总结
- iOS模拟器和真机调试时App的安装文件路径问题
- Android 设置EditText不会自动弹出键盘
- android 解压缩zip包