UIWebView使用时的问题,包含修改user agent
1.①像普通controller那样实现跳转到webview的效果,而不是直接加到当前controller
②隐藏webview的某些元素
③webview跳往原生app
④给webview添加进度条
解决方法如下:
①使用webview的基本步骤
NSURL *url = [NSURL URLWithString:self.urlStr];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
[self.webView loadRequest:request]; -(UIWebView *)webView{
if (!_webView) {
_webView = [[UIWebView alloc]initWithFrame:[UIScreen mainScreen].bounds];
_webView.delegate = self;
[self.view addSubview:_webView];
}
return _webView;
}
但这样webview是直接加在当前controller的,要实现跳转效果,应当写个controller,里边再添加webview
跳转是这样的
MyWebViewController *web = [[MyWebViewController alloc]initWithUrl:urlGo];
[self.navigationController pushViewController:web animated:YES];
MyWebViewController是这样定义的
.h文件
@interface MyWebViewController : UIViewController<UIWebViewDelegate> @property(nonatomic,copy) NSString *urlStr;
@end
.m内
@interface MyWebViewController () @property(nonatomic,strong) UIWebView *webView; @end @implementation MyWebViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor colorWithHexString:@"#f2f2f2"]; NSURLRequest *request = [NSURLRequest requestWithURL:url];
[self.webView loadRequest:request];
} -(UIWebView *)webView{
if (!_webView) {
_webView = [[UIWebView alloc]initWithFrame:[UIScreen mainScreen].bounds];
_webView.delegate = self;
[self.view addSubview:_webView];
}
return _webView;
}
@end
这样就能实现webview的跳转和基本使用
②隐藏webview的元素
这需要在webview的代理方法中实现,并且用js来操作。先在chrome上用开发者工具,获取要隐藏的元素的class,然后用
document.documentElement.getElementsByClassName('元素的class')[].style.display = 'none'
//网页加载完成
-(void)webViewDidFinishLoad:(UIWebView *)webView{
//去除某个按钮
[webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.getElementsByClassName('ibar-toggle')[0].style.display = 'none'"]; //将controller标题改为webview标题
NSString *title = [webView stringByEvaluatingJavaScriptFromString:@"document.title"];
if (title.length) {
self.title = title;
}
}
③webview跳往原生app
这同样需要在webview的代理方法中实现
-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
在需要跳往webview的地方返回YES,跳往原生app的地方返回NO,再添加跳原生app的方法。这需要拦截url内的字符串判断比较。如跳往商品详情页
http://xxx.com/wap/getItemDetail/146762587051761769.htm
//网页加载之前执行该方法
-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{
NSString *resuestStr = request.URL.absoluteString; if ([resuestStr rangeOfString:@"getItemDetail"].location != NSNotFound) {
NSArray *tempArr1 = [resuestStr componentsSeparatedByString:@"getItemDetail/"];
NSString *tempStr1 = [tempArr1 lastObject];
NSString *itemCode = [tempStr1 stringByReplacingOccurrencesOfString:@".htm" withString:@""]; ProductDetailViewController *vc = [[ProductDetailViewController alloc]initWithItemCode:itemCode];
[self.navigationController pushViewController:vc animated:YES]; return NO;
} return YES;
}
④给webview添加进度条
这需要用到第三方库NJKWebViewProgress,github地址为https://github.com/ninjinkun/NJKWebViewProgress
上边写的已经很清楚
要改变进度条的颜色,需要在NJKWebViewProgressView.m里configureViews方法修改
UIColor *tintColor = [UIColor colorWithRed:/255.0 green:/255.0 blue:/255.0 alpha:];
2.修改user agent
修改user agent,主要是用来区分由哪个设备来访问wap页
这需要在初始化webview时处理,并用到registerDefaults方法。如在webview的controller中
-(UIWebView *)webView{
if (!_webView) {
_webView = [[UIWebView alloc]initWithFrame:[UIScreen mainScreen].bounds];
_webView.delegate = self;
[self.view addSubview:_webView];
}
return _webView;
}
初始化该controller时,应在如init的方法中添加
-(instancetype)init{
if (self = [super init]) {
// 往user-agent里增加SHP-APP字段
UIWebView *webView = [[UIWebView alloc] initWithFrame:CGRectZero];
NSString *secretAgent = [webView stringByEvaluatingJavaScriptFromString:@"navigator.userAgent"];
if ([secretAgent rangeOfString:@"SHP-APP"].location == NSNotFound) {
secretAgent = [NSString stringWithFormat:@"%@ SHP-APP",secretAgent];
NSDictionary *dictionary = [[NSDictionary alloc] initWithObjectsAndKeys:secretAgent, @"UserAgent", nil];
[[NSUserDefaults standardUserDefaults] registerDefaults:dictionary];
}
}
return self;
}
UIWebView使用时的问题,包含修改user agent的更多相关文章
- time.h文件中包含的几个函数使用时须注意事项
time.h头文件中包含以下函数 char* asctime(const struct tm *tm); char* asctime_r(const struct tm *tm,char *buf); ...
- 【WPF】当 ItemsSource 正在使用时操作无效。改用 ItemsControl.ItemsSource 访问和修改元素
问题: 中文版报错:Additional information: 当 ItemsSource 正在使用时操作无效.改用 ItemsControl.ItemsSource 访问和修改元素. 英文版报错 ...
- ubuntu修改capslock键,单独使用为esc,组合使用时为ctrl+
一.下面这部分可以将capslock与ctrl互换 将下面的代码放入-/.Xmodmap中, remove Lock = Caps_Lock remove Control = Control_L ke ...
- MySQL数据库使用时注意事项
MySQL数据库使用时注意事项 建表的角度上 1.合理安排表关系 2.尽量把固定长度的字段放在前面 3.尽量使用char 代替varchar 4.分表:水平分和垂直分 在使用sql语句的时候 1.尽量 ...
- Android插件化(三):OpenAtlas的插件重建以及使用时安装
Android插件化(三):OpenAtlas的插件重建以及使用时安装 转 https://www.300168.com/yidong/show-2778.html 核心提示:在上一篇博客 An ...
- EntityFrameWork 使用时碰到的小问题
EntityFrameWork 使用时碰到的小问题 1,在使用orm访问数据库的相目里,也要引用EntityFrameWork.dll,否则无法使用orm 否则,编译错误 错误 5 "Sys ...
- MySQL 安装和启动服务,“本地计算机 上的 MySQL 服务启动后停止。某些服务在未由其他服务或程序使用时将自动停止。”
MySQL 安装和启动服务,以及遇到的问题 MySQL版本: mysql-5.7.13-winx64.zip (免安装,解压放到程序文件夹即可,比如 C:\Program Files\mysql-5. ...
- Apache下开启SSI配置使html支持include包含
写页面的同学通常会遇到这样的烦恼,就是页面上的 html 标签越来越多的时候,寻找指定的部分就会很困难,那么能不能像 javascript 一样写在不同的文件中引入呢?答案是有的,apache 能做到 ...
- [开发笔记]-sqlite数据库在使用时遇到的奇葩问题记录
有时候做些简单的项目一般都会选择sqlite数据库,优点有很多,这里就不详细说了. 在此主要记录一些平时在使用时遇到的问题及解决方法.希望能对大家有所帮助. --------------------- ...
随机推荐
- UI Automator Viewer获取手机镜像时报错
使用UI Automator Viewer获取手机镜像时报错,具体信息如下: Error while obtaining UI hierarchy XML file: com.android.ddml ...
- android国际化操作
1.简单介绍 我们知道在java中通过.properties文件来配置资源文件,一般用的有中文message_zh_CN.properties和英文message_en_US.properties两个 ...
- CentOS 6.8下安装MySQL 5.6.33
此处操作,包含MySQL的客户端及服务端. MySQL下载地址: http://dev.mysql.com/downloads/mysql/5.6.html MySQL--.linux_glibc2. ...
- connectionString加密
首先是加密,解密类. using System; using System.Collections.Generic; using System.IO; using System.Linq; using ...
- 慕客网laravel学习笔记
session中set方法使用 Session::set('user.username.age','18')嵌套使用得出$user = ['username'=>['age'=>18]]; ...
- BlockingQueue深入分析
1.BlockingQueue定义的常用方法如下 抛出异常 特殊值 阻塞 超时 插入 add(e) offer(e) put(e) offer(e,time,unit) 移除 remove() p ...
- petapoco IsNew
// Check if a poco represents a new record public bool IsNew(string primaryKeyName, object poco) { v ...
- SQL中使用WITH AS提高性能,使用公用表表达式(CTE)简化嵌套SQL
一.WITH AS的含义 WITH AS短语,也叫做子查询部分(subquery factoring),可以让你做很多事情,定义一个SQL片断,该SQL片断会被整个SQL语句所用到.有的时候, ...
- ORACLE8.07客户端配置指南
—本地机器网络连通配置 1.点击“开始”-〉“程序”菜单. 2.选择“Oracle-OracleHome81”-〉“Net Administrator”->“Net8 Configuration ...
- 关于HTML(JSP)页面的缓存设置 -- cache-control
我在项目中遇到这么一个问题,当用户登录了系统后,进入并copy下系统某个页面的link,然后关闭浏览器,重新打开浏览器,把刚才复制好的link paste到浏览器的地址栏去,直接enter,发现浏览器 ...