APP 内嵌H5, H5页面可见性改变事件 : visibilitychange

经过和APP同时沟通可以确定, 两种情况:

  1. 原生入口–>H5–>返回原生;
    这个情况下,原生会销毁H5的webview这种情况;
  2. 原生入口–>H5–>打开新的原生(如登录);
    这个情况下,webview’会缓存,只能使用相关回调(如登陆后的回调;
  3. 原生入口–>H5–>第三方网站(如支付)
    这个情况下,webview’会缓存

对于上述1和3的情况, 可以监听路由变化如:beforeRouteEnter进行逻辑处理, 亲测有效;

  • 摘要:

本文主要描述的是本人在开发过程中遇到的问题, 以及如何利用 visibilitychange 解决的相关记录。

visibilitychange 事件, 简单的说就是 document 对象绑定的一个方法, 在H5页面 隐藏或者显示 的时候触发。

  • 遇到的问题(H5, 指的是Vue的页面)

前景: APP 内嵌 H5 活动页面, 入口在原生, 活动页面有登陆状态的判断逻辑, 登陆为 APP 原生登陆, 登陆成功返回该活动页面;----- 流程图如下:

Created with Raphaël 2.2.0 原生入口 H5活动页面 是否登录? 原生登陆页面 登陆成功? no yes
  1. 问题: 未登录进入时, 个人积分不展示, 原生登陆成功后返回该页面, 页面数据没有更新,还是未登录状态;经调试发现, 页面所有的钩子函数都不执行;`
  2. 猜测: APP内部打开H5, 然后离开H5跳转回原生页面, 因为(我们)APP 打开H5的webview是不销毁的(webview可以理解为一个容器,APP用来打开H5页面的,我的理解是类似于浏览器的一个窗口); 所以很可能是APP首次进入,就把H5页面包括资源全部缓存下来,下次在进入这个H5的时候,数据就不会更新了,使用的是之前缓存的数据.`
  • 验证
  1. 网上查阅资料得到的一个方法, HTML的head总增加三个meta标签:
    结果: IOS生效, android 不生效, 开始怀疑是不是缓存导致的, 为什么安卓不生效, 因为能力有限, 所以还是不太清楚 原因;
`后面的注释, 是我自己的理解`
 <meta http-equiv="Pragma" content="no-cache">  <!-- 关闭缓存 -->
 <meta http-equiv="Cache-Control" content="no-cache"> <!-- 关闭缓存 -->
 <meta http-equiv="Expires" content="0"> <!-- 立即过期,也就是重新请求资源 -->

  1. 偶然发现 visibilitychange 这个方法, 于是就开始 google, 最终功夫不负有心人;
    结果: 完美解决了我的问题, 在document.hidden === false的时候, 我重新请求数据接口,更新数据就可以了
    理解: 感觉这种情况, 更像是APP把H5页面后台挂起,(或者通俗说是隐藏掉,用户不可见而已), H5页面还是一直存在, 所以页面不会重新加载, 更别说登陆前后数据变化了.
// Set the name of the hidden property and the change event for visibility
 var hidden, visibilityChange;
 if (typeof document.hidden !== "undefined") {
   // Opera 12.10 and Firefox 18 and later support hidden = "hidden";
   visibilityChange = "visibilitychange";
 } else if (typeof document.msHidden !== "undefined") {
   hidden = "msHidden";
   visibilityChange = "msvisibilitychange";
 } else if (typeof document.webkitHidden !== "undefined") {
   hidden = "webkitHidden";
   visibilityChange = "webkitvisibilitychange";
 }

 handleVisibilityChange() {
   if (document.hidden) { // 页面隐藏
     console.log(document.hidden, document.visibilityState)  // true 'hidden'
   } else { // 页面展示
     console.log(document.hidden, document.visibilityState)  // false 'visible'
   }
 }

 // Warn if the browser doesn't support addEventListener or the Page Visibility API
 if (typeof document.addEventListener === "undefined" || hidden === undefined) {
   console.log("This demo requires a browser, such as Google Chrome or Firefox, that supports the Page Visibility API.");
 } else {
   // Handle page visibility change   
   document.addEventListener(visibilityChange, handleVisibilityChange, false);
 }
  1. 因为使用的是 webViewJavascriptBridge 和APP协作开发, 所以可以 H5这边注册一个登陆成功的方法, 让APP调用, 然后回调里 执行 更新数据操作就可以了.

注意****2. 3 两种方式, 虽然可以成功解决问题, 但是(本人)安卓会出现大概 1s 左右的白屏, 目前还没有解决.希望有大佬可以帮忙指点一下.

本文参考来自: https://www.jianshu.com/p/e905584f8ed2


  • 学习使我快乐
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
随着互联网的发展,移动互联网的普及,手机APP已成为人们使用最多的移动终端产品之一。随着越来越多的APP应用的涌现,越来越多的APP需要内嵌H5页面WebView进行网页的展示和交互。WebView是一种可在应用程序中嵌入Web页面的控件,可以用来显示来自互联网上的Web页面。它可以实现在应用中展示网页或在线功能,解决一些本地应用无法实现的功能。下面,我们分别从用户、开发者两个方面来探讨APP内嵌H5页面WebView的优缺点。 一、用户方面: 优点: 1.节省时间:在APP中直接查看嵌入的网页,省去了用户手动打开浏览器输入网址的步骤; 2.良好的用户体验:页面加载速度相对较快,而且对主应用对内存占用少,不影响其他应用的使用; 3.方便分享:在WebView中打开的网页可以长按复制网址链接,方便分享给其它用户; 4.强大的交互能力:在APP中嵌入H5页面,拓展了应用的交互能力。 缺点: 1.便捷带来的安全隐患:一些App会在内嵌H5页面中嵌入第三方广告,导致用户隐私泄露; 2.缺乏统一标准:因为浏览器的内核和引擎都是不同的,所以在不同的WebView中,同一网页的显示效果和交互体验可能会有差异。 二、开发者方面: 优点: 1.拓展应用功能:借助WebView内嵌H5页面,应用的功能可以得到极大的拓展; 2.代码复用:WebView可以实现HTML、CSS等内容的兼容,减轻了移动开发者负担; 3.节省开发成本:相对于开发单独的H5 APP内嵌方式更为灵活,可以适用于不同场景和需求。 缺点: 1.不支持多线程:WebView在JS调用本地方法的时候是在同一线程下执行的,如果WebView的内容较为复杂,可能会导致主线程卡顿; 2.能问题:在内存管理、布局排版等方面还不如原生应用; 3.浏览器兼容:WebView的内核并没有得到很好的统一,不同的WebView之间有兼容问题,会导致页面显示和交互问题; 4.安全问题:WebView加载HTML页面时容易受到跨站脚本(XSS)和恶意代码注入等安全漏洞的攻击。为此,开发者应该加强前端页面安全防范,对浏览器缓存和Cookie进行管理并开启CSP(内容安全策略)。 综合来看,在APP内嵌H5页面WebView上,开发者需要在开发时注意安全方面的问题,同时还需要加强对WebView能和兼容的了解和优化。用户便捷和良好的用户体验,也需要开发者在开发时重视。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值