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')[0].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:0/255.0 green:224/255.0 blue:94/255.0 alpha:1];

 

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;
}
原文地址:https://www.cnblogs.com/Apologize/p/5662890.html