微信小程序webview部分安卓机localStorage失效,兼容localStorage 和cookie

本文探讨了在特定安卓设备上使用小程序时localStorage数据丢失的问题,详细介绍了原localStorage封装及针对此问题的兼容性解决方案,包括如何在localStorage失效时利用cookie进行数据存储。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.出现问题

最近一一个项目小程序webview页面使用到小程序穿过去的数据进行调用,在苹果的手机都是没有用问题的,一直好好的,后面测试拿来了国产的各大品牌的安卓机测试,噩梦就开始了,在华为和oppe手机会出现localStorage存储的数据失效,导致传过去的数据没有了,造成业务流程不同。

二、原来的localStorage的封装

// An highlighted block
/**
 * Created by wuxuanhua on 18/8/3
 */
'use strict'

import Vue from 'vue'
import _ from 'lodash'
import Base64 from '~/utils/base64'

const Storage = (function () {
  let Params = {
    hondaUserObj: null,
    hondaPasswordObj: null, // 记住登录密码
    thirdLoginBackUrl: null,
  }

  // 定义类
  class Storage {
    constructor () {
      this.storage = window.localStorage
    }

    // set
    set (key, value) {
      this.storage.removeItem(key)
      this.storage.setItem(key, Base64.encode(value))
    }

    // get
    get (key) {
      let value = this.storage.getItem(key) || ''
      if (value !== '' && Object.prototype.toString.call(value) === '[object String]') {
        // 未经base64处理的数据
        if (value.indexOf('{') >= 0 || value.indexOf(':') >= 0 || value.indexOf('}') >= 0) {
          this.storage.removeItem(key) // 清除该存储内容
          value = ''
        } else {
          value = Base64.decode(value)
        }
      }
      return value
    }

    // remove
    remove (key) {
      this.storage.removeItem(key)
    }

    // clear
    clear () {
      this.storage.clear()
    }
  }

  let StorageObj = new Storage() // 存储操作对象
  // 本地存储封装对象
  let StorageService = {} // new Object();
  _.each(Params, (value, key) => {
    StorageService[key] = {
      set: (value) => {
        StorageObj.set(key, value)
      },
      get: () => {
        return StorageObj.get(key)
      },
      getReset: () => {
        let _value = StorageObj.get(key)
        StorageObj.remove(key)
        return _value
      },
      clear: () => {
        StorageObj.remove(key)
      },
      clearAll: () => {
        StorageObj.clear()
      }
    }
  })

  return StorageService
})()

Vue.prototype.$storage = Storage // VUE全局变量 Storage
export default Storage

三、兼容localStorage和cookie的封装

为了处理这烦人的事情,如果把localStorage 全都换回cookie改动的页面太大了,大家都懂的,贼烦!!!!!!只好做localStorage 和cookie的兼容了,在localStorage 失效的时候调用cookie来存储数据,然而这两个小东西并不是那么可爱了!!!!

1.增加获取document.cookie

 // 定义类
 class Storage {
   constructor () {
     this.storage = window.localStorage
     this.cookieData = document.cookie
   }

2.存储localStorage,如果localStorage失效,value为空时,存取cookie

// set
   set (key, value) {
     // console.log('set')
     if (value === '') {
       let expiredays = 30
       let exdate = new Date()
       exdate.setDate(exdate.getDate() + expiredays)
       this.cookieData = key + '=' + escape(value) + ((expiredays === null) ? '' : ';expires=' + exdate.toGMTString())
       this.storage.removeItem(key)
       this.storage.setItem(key, Base64.encode(value))
     } else {
       this.storage.removeItem(key)
       this.storage.setItem(key, Base64.encode(value))
     }
   }

4.存储cookie,获取cookie,移除cookie

 /* -------- cookie -------- */
   // cookie
   setCookie (key, value, expiredays = 30) {
     let exdate = new Date()
     exdate.setDate(exdate.getDate() + expiredays)
     this.cookieData = key + '=' + escape(value) + ((expiredays === null) ? '' : ';expires=' + exdate.toGMTString())
   }
   // 取回cookie
   getCookie (key) {
     if (this.cookieData.length > 0) {
       let startData = this.cookieData.indexOf(key + '=')
       if (startData !== -1) {
         startData = startData + key.length + 1
         let endData = this.cookieData.indexOf(';', startData)
         if (endData === -1) {
           endData = this.cookieData.length
         }
         let value = unescape(this.cookieData.substring(startData, endData))
         return value
       }
     }
     return ''
   }

   // 移除cookie
   removeCookie (key) {
     let exdate = new Date()
     exdate.setDate(exdate.getDate() - 1)
     let cval = this.getCookie(key)
     if (cval !== null) {
       this.cookieData = key + '=' + cval + ';expires=' + exdate.toGMTString()
     }
   }
 }

5.如果localStorage失效,返回cookie

 get: () => {
       return StorageObj.get(key) ? StorageObj.get(key) : StorageObj.getCookie(key)
     },

6.清除localStorage和cookie

getReset: () => {
       if (StorageObj.get(key)) {
         let _value = StorageObj.get(key)
         StorageObj.remove(key)
         return _value
       } else {
         let _value = StorageObj.getCookie(key)
         StorageObj.removeCookie(key)
         return _value
       }
     },
 clear: () => {
       if (StorageObj.get(key)) {
         StorageObj.remove(key)
       } else {
         StorageObj.removeCookie(key)
       }
     },

四、第一次写博客,请多多关照,望以后可以写一些有价值的东西

写的东西不多,希望可以遇到这个问题的小伙们,若文中有错,希望大佬们指正一下小弟,小弟菜鸡前端一枚。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值