收集EPG开发过程中所遇问题、总结盒子区别于浏览器特点、项目异常排查思路等信息

目录

  • 盒子特性
  • 界面兼容
  • 代码兼容
  • 平台兼容
  • 排查思路

盒子特性

大部分盒子(中国IPTV机顶盒、中国移动机顶盒、中国广电机顶盒、第三方OTT项目所用盒子)遵循的规则,但是不包括所有

  • 关机后 cookie 清空
  • IPTV规范针对 JavaScript 扩展 API 通过闭包或 require 加载会出现接口无法访问(如:获取盒子账号、获取返回 Launch 等)解决方案:
    • 在页面加载前默认引入一个原生代码文件(未经过任何编译 webpack、babel等构建工具加工),在里面获取盒子方法赋值为全局变量,比如window.UserID = Authentication.CTCGetConfig("UserID") || 'browser';

界面兼容

  • 数码视讯 Q5 小窗视频会覆盖所有元素背景图片样式。添加背景图片可能导致屏幕部分黑屏,解决方案:
    -背景图片使用 img 标签代替
  • line-height 居中文字盒子展示有差异,使用 padding + font-size 代替 line-height 高度
  • 部分盒子加载超长图片会失真模糊,浏览器自动降低图片分辨率进行下载,解决方案拆分成多个部分显示时进行组装
  • 绝大部分盒子默认背景色为黑色,部分为其他颜色(比如四川移动为红色)
  • 烽火盒子背景图片切换会闪动;使用 visibility 代替 display:none 方式来显示图片(推测 display 导致文档流重绘时发生过多性能损耗)
  • 带有 bottom 属性元素消失,考虑盒子对于该属性解析失效,推荐采用 top 设置样式
  • GIF过多对性能损耗特别大,内容过小或者性能过差盒子容易导致直接问题为:页面卡顿或者停留时间过长盒子死机等情况

代码兼容

  • 创维 E900 返回简码与其它盒子不一致 Key.Backspace2且隐藏视频接口 this.mediaPlay.setVideoDisplayMode(255)无效
  • 安徽-海信-ZP906H 全局 top 属性作为 js 关键字。再次声明或赋值操作为无效。尽可能不要使用该关键字 top
  • APK 暴露的方法不要使用 let var 去定义 否则导致为空(体现在 API 与 EPG 交互场景中)
  • 烽火盒子 window.onkeydown 有时会失效,解决方案:
    • 加载时主动触动 window.focus() (该盒子对于已经访问过页面貌似不主动聚焦文档,需要主动激活)
  • 在已经有视频播放情况下,切换片源,建议操作如下且(IPTV播放器是异步操作,注意流程中插入间隔):
    1. 暂停播放
    2. 结束流
    3. 释放播放器
    4. 创建播放器
    5. 调用播放器播放新片源
  • 创维E8205 在 A 页面创建播放器没有释放情况到 B 页面进行播放 这时 Backspace 被系统阻止.释放播放器后可恢复该异常
  • 不要使用 default 导出 低版本内核实现 default 会报错(包括其他关键字 return 作为属性,let const class 作为属性名等)
  • 生成 ES5 代码时由于盒子环境不支持部分 ES5 标签因此需要我们转换为 ES3 webpack 配置 es3ify-loader 加载器可解决这个问题
  • 不可使用 a 标签,除非你完全清楚他在不同盒子的表现。通常 a 标签是默认的且可受 按键操控(移动、确认) 大部分情况下这个并不是我们需要的
  • 盒子调试可配置 ie8 环境。该环境都能正常运行基本可保证盒子可运行。目前 4k 盒子比 ie8 兼容还要好一些比如 ie8 中报错的 Object.defineProperty 在盒子基本能正常运行
  • 烽火盒子对 BUG 绝对敏感,遇到烽火盒子不能运行其他盒子可以运行情况,最佳方式抓 ADB 日志。绝大部分可能性是程序运行时调用到空对象(大部分盒子会忽略这种错误))
  • 本地可以访问,盒子API报错,通常IP段分内网外网,盒子是内网 PPEOP 拨号基本是内网,查看配置文件 是否处理动态匹配API域名
  • 盒子播放直播串切小屏切换全屏或者全屏切换小屏会导致视屏源丢失;需要重新调用播放;播放频道号不存在这个问题
  • 播放器通常放在页面加载处实例化,以保证全局仅实例化一次。
  • 播放频道需要使用 Number 进行类型转换,不然有可能存在潜在问题
  • 多个页面操作播放频道时,最好先调用离开频道方法,再掉进入频道,否则部分盒子导致频道播放黑屏
  • 安徽天翼盒子不支持调频道号进行播放(或者该账号不支持当前所播放频道。可以在频道太直接进入频道进行判断,该频道在当前环境是否正常)
  • 烽火 HG680-J 调用 joinChannel 传入空频道号,会导致盒子重启。解决方案进行判断再调用
  • 刚创建的播放器不需要调用 leaveChannel 部分盒子可导致异常
  • 播放频道号数据源为空导致异常重启(直接进入频道看是否正常播放)
  • 华为盒子对于渲染引擎与JS解释器切换不够及时。直接追加元素在通过父元素获取可能为空,可在获取代码做延迟处理
  • 部分盒子出现闪退问题,如果是在同一步动作复现,很大可能是该部分代码出现类型错误
  • 部分盒子出现闪退问题,焦点切换一段时间,系统自动退出。去掉 transition 等一系列 CSS3 属性便可恢复
  • 部分盒子出现闪退问题,(特别是移动盒子)GIF图片导致性能瓶颈盒子闪退,去掉动图便可解决
  • 移动部分盒子自动缓存API接口,加入时间戳可解决
  • 移动部分盒子 Cookie 存储时 path=/ 导致存储失败,采用默认路径,即不设置 path 属性可正常存取
  • 部分盒子EPG中有嵌套iframe导致页面比例异常放大,需要在 iframe 嵌套页面设置显示比例viewport 和 page-view-size
  • 部分盒子加载缓慢,切换数据卡顿。考虑是否内存过小,此基础上进行优化
  • 播放器无法监听播放结束事件解决方案
  • 部分盒子对cookie操作过多时,盒子性能过差容易导致的问题为:页面逐渐出现卡顿或者直接退出到launcher等情况

平台兼容

  • 片源中只有部分影片正常播放,测试网络 DHCP与 PPOE 可能导致网络不一样

排查思路

EPG 页面黑屏是怎么回事?

导致此种情况的常见情况:

  1. 代码报错程序未正常渲染,因为机顶盒默认背景是黑色,所有黑屏(可能红色,取决于盒子默认背景色)
  2. UI布局是否有黑色元素挡在最上层
  3. 是否 float 布局属性或者其他布局属性没有生效导致显示元素超出显示区域
  4. 加载了视频片源,片源内容是黑色或长时间在黑色内容时缓冲(观察界面是否有转圈加载提示)

进入 EPG 盒子自动重启是什么原因?

导致此种情况的常见情况:
1.代码报错程序异常退出,导致盒子自动重启。可思考近期修改那部分代码,进行删除验证或通过抓取 ADB 日志观察 TypeError 相关异常所处代码
2.内存过小,部分盒子内存512MB或者更小,内存溢出导致盒子重启。通常这种盒子没法做前端渲染,可以考虑 php、java或其他语言进行服务端渲染,前端只做简单的焦点响应,以此降低内存负载
3.大量 GIF 动画盒子内存溢出,导致重启。GIF 是盒子兼容性最好的实现动画方式,但是其消耗也是巨大的

EPG 页面有块黑***域是怎么回事?

导致此种情况的常见情况:
1.是否创建了播放器,如果创建试着释放掉看看该区域是否正常

页面跳转了还有视频在播放是为什么?

播放器与 EPG 运行环境是同级的,一般情况下 EPG 页面生命周期不影响播放器。因此需要主动释放

页面有声音没图像是怎么回事?

导致此种情况的常见情况:
1.检测是否设置视频显示区域
2.检测是否设置全屏显示
3.IPTV 在设置显示区域后有一个主动刷新函数,调用后才会生效,考虑是否存在这种情况
4.UI 是否有元素覆盖了视频,通常视频在所有 EPG 元素的底下,也有始终在元素顶部情况(通过 zindex 属性也无法解决),解决方案,如果是小窗那么将小窗显示区域设置为透明 png 图片,如果是全屏,试试隐藏界面所有元素

常规调试途径有哪些?

没有调试途径!!!
但是可以试试在页面显示一个元素,再将打印信息设置在该元素里面。

参考

盒子与浏览器差异