最近负责公司各产品线购买模块的开发,各项功能如期开发完成后测试那边反馈回来一个问题: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 }
经测试,解决此问题。