• 【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/


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

  • 相关阅读:
    ffmpeg+nginx+video实现rtsp流转hls流,通过H5查看监控视频
    视频支持拖动进度条播放的实现(基于nginx)
    nginx 点播mp4方法
    NGINX 添加MP4、FLV视频支持模块
    html5播放mp4视频代码
    ThreadPoolExecutor使用错误导致死锁
    Spring-Cloud-Gateway
    从0开始构建你的api网关--Spring Cloud Gateway网关实战及原理解析
    使用Consul做服务发现的若干姿势
    Consul 的安装与基本使用
  • 原文地址:https://www.cnblogs.com/fengtengfei/p/4644237.html
Copyright © 2020-2023  润新知