第三方网站返回hybrid app H5页面缓存问题应对策略

Posted keang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第三方网站返回hybrid app H5页面缓存问题应对策略相关的知识,希望对你有一定的参考价值。

  最近负责公司各产品线购买模块的开发,各项功能如期开发完成后测试那边反馈回来一个问题:ios手机在点击支付宝购买后,跳转到支付宝网站时不输入支付密码,直接点返回,返回到我们自己的APP购买界面发现参数丢失,数据都没有了,不能完整的还原整个购买界面,安卓手机不存在这个问题。经排查,原来是苹果手机的缓存策略导致,从第三方支付宝网站返回后,苹果手机缓存了无参数的购买页面,导致返回的时候不再发送post请求去服务器请求数据,只是get了一个无参数的页面,导致异常。

  这个问题比较棘手,因为我们已经使用了cookies来存储页面数据,当没有页面参数传入的时候就去cookie里面取,这种方法对安卓手机是管用的,但是对于IOS的缓存策略,这手机已经不会再去取参数了,只会get到缓存过的无参数的页面,因此我们需要单独针对IOS的移动设备做解决方案。.

  经尝试,决定使用sessionStorage来规避IOS页面被缓存的问题。正请求使用SessionStorage来存储参数,然后和缓存的历史页面参数做对比,不一致则location.reload(true)强制刷新。关键代码如下:

 1 beforeCreate() {
 2             let ua = navigator.userAgent.toLowerCase();
 3             if (ua.indexOf(‘ipad‘) > -1 || ua.indexOf(‘iphone‘) > -1) {
 4                 try {
 5                     let key = ‘_purchase_page_params_‘,
 6                         deviceId = PAGE_PARAMS.deviceId;
 7                     if (history.length > 1) {//当从第三方页面返回
 8                         if (!deviceId) {  //若没有获取到设备id,则强制刷新
 9                             location.reload(true);
10                         } else {
11                             let storageParams = null,
12                                 str = sessionStorage.getItem(key) || ‘‘;
13                             if (str) {
14                                 storageParams = JSON.parse(str);
15                             }
16                             if (storageParams && storageParams.deviceId !== deviceId) {//对比参数,不一致则强制刷新
17                                 location.reload(true);
18                             }
19                         }
20                     } else {
21                         sessionStorage.setItem(key, JSON.stringify(PAGE_PARAMS));
22                     }
23                 } catch (e) {
24                     console.error(e.message);
25                 }
26             }
27         }

经测试,解决此问题。

以上是关于第三方网站返回hybrid app H5页面缓存问题应对策略的主要内容,如果未能解决你的问题,请参考以下文章

Hybrid APP之Native和H5页面交互

Android与H5互调(通过实例来了解Hybrid App)

Hybrid App 离线包方案实践

前端开发怎么设置关闭当前页面删除h5缓存记录

混合 App 打开 H5 调试开关

混合 App 打开 H5 调试开关