zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    static_cast与dynamic_cast的联系与区别
    ActiveX控件实现
    Foundation: Rapid Prototyping and Building Framework from ZURB
    Python datetime / time conversions « SaltyCrane Blog
    Extending Django’s database API to include fulltext search
    解决linux下/etc/rc.local开机器不执行的原因。
    巧用 /etc/rc.local,开机时完成一些自动任务 GNU/Linux,Windows的終結者 KM大宝 和讯博客
    Kill process by name in python Stack Overflow
    Linux iostat监测IO状态
    An Introduction to Python: File I/O
  • 原文地址:https://www.cnblogs.com/Apologize/p/5662890.html
Copyright © 2011-2022 走看看