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

  最近负责公司各产品线购买模块的开发,各项功能如期开发完成后测试那边反馈回来一个问题:IOS手机在点击支付宝购买后,跳转到支付宝网站时不输入支付密码,直接点返回,返回到咱们本身的APP购买界面发现页面显示内容是第一次进入购买页面时候的设备信息,不能完整的还原新设备的购买界面,安卓手机不存在这个问题。经排查,原来是苹果手机的缓存策略致使,第一次点击购买的时候,参数已经注入到页面,post请求后正确跳转到第三方支付宝网站,不购买直接返回,因为苹果手机缓存了以前的购买页面,致使返回的时候再也不发送post请求去服务器请求数据,只是get了缓存的一个页面,致使页面信息不对。缓存

  这个问题比较棘手,由于咱们已经使用了cookies存储页面数据来解决从第三方网站返回时候页面参数丢失的问题,当没有页面参数传入的时候就去cookie里面取,这种方法对安卓手机是管用的,由于安卓手机是缓存的连接,可是对于IOS的缓存策略,已经不会再去发送post请求取参数了,所以咱们须要单独针对IOS的移动设备作解决方案。.服务器

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

 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         }

经测试,解决此问题。session

相关文章
相关标签/搜索