zoukankan      html  css  js  c++  java
  • 【iOS进阶】UIWebview加载搜狐视频,自动跳回客户端 问题解决

    UIWebview加载搜狐视频,自动跳回搜狐客户端 问题解决

    当我们用UIWebview(iOS端)加载网页视频的时候,会发现,当真机上有搜狐客户端的时候,会自动跳转到搜狐客户端进行播放,这样的体验对我们的体验并不好,所以应该禁掉。

    问题分析:

    首先想到的是这种情况肯定是网页的上的js引发的,于是就查看到网页源码中有这样的js

    function() {
        try {
            var u = navigator.userAgent;
            var m = u.match(/iPhone|iPad|iPod/i);
            if ((location.href.indexOf('#pc') === -1) && (m || u.indexOf('Android') > -1)) {
                if (m && m[0] === 'iPad') {
                    location.href = location.href.replace('http://tv', 'http://pad.tv');
                } else {
                    location.href = location.href.replace('http://tv', 'http://m.tv');
                }
            }
        } catch(e) {}
    })
    

    这个js函数作用时当检测到播放的客户端是手机或者pad时进行url的替换,(电脑端和手机,pad上呈现的效果不一样)。那么问题到这里就很明晰了,后面的肯定就是检测设备上有没有客户端,有的话,就启动客户端。OC中是调用Url Schema,但是在源码中没有找到。

    但是如果我们在加载页面的代理中拦截这个js进行替换,应该也能解决问题,但问题这个js是匿名的,OC中怎样进行调用,好像挺困难的。那么路肯定不只有一条。

    问题解决:

    了解了一下uiwebview的代理方法中

    -(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{}
    

    文档中的解释是:YES if the web view should begin loading content; otherwise, NO .

    所以也就是只要页面有跳转,就会调用这个方法,其返回YES的时候能进行调转,返回NO的时候不能进行调转,

    拦截其加载过程的URL发现:

    先是: http://tv.sohu.com/
    后是: http://m.tv.sohu.com/
    最后是:sohuvideo://action.cmd
    

    那么最后一个肯定就是调转回客户端的url了,所以拦截这个

    -(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
    {
         NSString *urlStr = request.URL.absoluteString;
         NSString *urlStr = request.URL.absoluteString;
        if ([urlStr rangeOfString:@"sohuvideo:"].location != NSNotFound || [urlStr rangeOfString:@"action.cmd"].location != NSNotFound ) {
            return NO;
        }else{
            return YES;
        }
    }
    

    这样问题得到完美解决,

    Demo工程:https://github.com/darren90/iOS_Demo/tree/master/02-UIWebview

    后来发现乐视也存在同样的问题,所以同样的思路也可以进行解决。


    欢迎您的访问...

    作者:Darren

    微博:@IT_攻城师

    github:@Darren90

    博客:http://www.cnblogs.com/fengtengfei/


    本文版权归本人和博客园所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。

  • 相关阅读:
    Java中try-catch-finally的一点理解
    子类继承父类的私有属性
    Java中的String[] args
    Java类和类成员的访问权限修饰符
    JAVA中抽象类与接口的区别
    Java C# .net 和 C C++ 跨平台的区别
    Java中的instanceof关键字
    深入理解JAVA的多态性[转]
    Linux文件系统的目录结构
    硬盘分区
  • 原文地址:https://www.cnblogs.com/fengtengfei/p/4644237.html
Copyright © 2011-2022 走看看