z***@163.com
z***@163.com
  • 发布:2025-03-18 11:03
  • 更新:2025-03-19 19:33
  • 阅读:85

【报Bug】,苹果系统,uni.setStorageSync()api,存储报错null is not an object (evaluating 'localStorage.setltem');

分类:uni-app

产品分类: uniapp/H5

PC开发环境操作系统: Windows

PC开发环境操作系统版本号: Microsoft Windows [版本 10.0.19045.5487]

HBuilderX类型: 正式

HBuilderX版本号: 4.56

浏览器平台: 微信内置浏览器

浏览器版本: 微信内置浏览器

项目创建方式: HBuilderX

示例代码:
export const setUserInfo = (userInfo) => {  
    // uni.setStorageSync('uInfo', userInfo);  
    const {  
        token,  
        ...uInfo  
    } = userInfo;  
    console.log('uInfo==', uInfo)  
    try {  
        // 显式检查 userInfo 是否存在  
        if (!uInfo) {  
            throw new Error('uInfo 不能为空');  
        }  
        uni.setStorageSync('uInfo', uInfo);  
        // // #ifdef H5   
        // localStorage.setItem('uInfo', JSON.stringify(uInfo));  
        // if (typeof localStorage !== 'undefined' && localStorage) {  
        //  localStorage.setItem('uInfo', JSON.stringify(uInfo));  
        // } else {  
        //  // 处理localStorage不可用的情况,例如记录日志或使用其他存储方式  
        //  console.error('localStorage is not available');  
        // }  
        // // #endif  

        // // #ifdef MP-WEIXIN   
        // uni.setStorageSync('uInfo', uInfo);  
        // // #endif  

    } catch (error) {  

        if (error.name === 'QuotaExceededError') {  
            // 提示用户设备存储可能不足  
            console.error('设备存储不足,localStorage 操作受限-user');  
        } else {  
            // 提示用户可能是隐私设置限制  
            console.error('由于隐私设置,localStorage 可能不可用-user');  
        }  
        throw error; // 抛出错误供外部捕获  
    }  
};

操作步骤:
export const setUserInfo = (userInfo) => {  
    // uni.setStorageSync('uInfo', userInfo);  
    const {  
        token,  
        ...uInfo  
    } = userInfo;  
    console.log('uInfo==', uInfo)  
    try {  
        // 显式检查 userInfo 是否存在  
        if (!uInfo) {  
            throw new Error('uInfo 不能为空');  
        }  
        uni.setStorageSync('uInfo', uInfo);  
        // // #ifdef H5   
        // localStorage.setItem('uInfo', JSON.stringify(uInfo));  
        // if (typeof localStorage !== 'undefined' && localStorage) {  
        //  localStorage.setItem('uInfo', JSON.stringify(uInfo));  
        // } else {  
        //  // 处理localStorage不可用的情况,例如记录日志或使用其他存储方式  
        //  console.error('localStorage is not available');  
        // }  
        // // #endif  

        // // #ifdef MP-WEIXIN   
        // uni.setStorageSync('uInfo', uInfo);  
        // // #endif  

    } catch (error) {  

        if (error.name === 'QuotaExceededError') {  
            // 提示用户设备存储可能不足  
            console.error('设备存储不足,localStorage 操作受限-user');  
        } else {  
            // 提示用户可能是隐私设置限制  
            console.error('由于隐私设置,localStorage 可能不可用-user');  
        }  
        throw error; // 抛出错误供外部捕获  
    }  
};

预期结果:
export const setUserInfo = (userInfo) => {  
    // uni.setStorageSync('uInfo', userInfo);  
    const {  
        token,  
        ...uInfo  
    } = userInfo;  
    console.log('uInfo==', uInfo)  
    try {  
        // 显式检查 userInfo 是否存在  
        if (!uInfo) {  
            throw new Error('uInfo 不能为空');  
        }  
        uni.setStorageSync('uInfo', uInfo);  
        // // #ifdef H5   
        // localStorage.setItem('uInfo', JSON.stringify(uInfo));  
        // if (typeof localStorage !== 'undefined' && localStorage) {  
        //  localStorage.setItem('uInfo', JSON.stringify(uInfo));  
        // } else {  
        //  // 处理localStorage不可用的情况,例如记录日志或使用其他存储方式  
        //  console.error('localStorage is not available');  
        // }  
        // // #endif  

        // // #ifdef MP-WEIXIN   
        // uni.setStorageSync('uInfo', uInfo);  
        // // #endif  

    } catch (error) {  

        if (error.name === 'QuotaExceededError') {  
            // 提示用户设备存储可能不足  
            console.error('设备存储不足,localStorage 操作受限-user');  
        } else {  
            // 提示用户可能是隐私设置限制  
            console.error('由于隐私设置,localStorage 可能不可用-user');  
        }  
        throw error; // 抛出错误供外部捕获  
    }  
};

实际结果:
export const setUserInfo = (userInfo) => {  
    // uni.setStorageSync('uInfo', userInfo);  
    const {  
        token,  
        ...uInfo  
    } = userInfo;  
    console.log('uInfo==', uInfo)  
    try {  
        // 显式检查 userInfo 是否存在  
        if (!uInfo) {  
            throw new Error('uInfo 不能为空');  
        }  
        uni.setStorageSync('uInfo', uInfo);  
        // // #ifdef H5   
        // localStorage.setItem('uInfo', JSON.stringify(uInfo));  
        // if (typeof localStorage !== 'undefined' && localStorage) {  
        //  localStorage.setItem('uInfo', JSON.stringify(uInfo));  
        // } else {  
        //  // 处理localStorage不可用的情况,例如记录日志或使用其他存储方式  
        //  console.error('localStorage is not available');  
        // }  
        // // #endif  

        // // #ifdef MP-WEIXIN a  
        // uni.setStorageSync('uInfo', uInfo);  
        // // #endif  

    } catch (error) {  

        if (error.name === 'QuotaExceededError') {  
            // 提示用户设备存储可能不足  
            console.error('设备存储不足,localStorage 操作受限-user');  
        } else {  
            // 提示用户可能是隐私设置限制  
            console.error('由于隐私设置,localStorage 可能不可用-user');  
        }  
        throw error; // 抛出错误供外部捕获  
    }  
};

bug描述:

苹果系统真机使用存储:uni.setStorageSync()api,localStorage.setItem,api(这两个api都会报错),存储报错null is not an object (evaluating 'localStorage.setltem');开发者工具测试正常,安卓系统测试正常;

2025-03-18 11:03 负责人:DCloud_UNI_OttoJi 分享
已邀请:
DCloud_UNI_OttoJi

DCloud_UNI_OttoJi - 日常回复 uni-app/x 问题,如果艾特我没看到,请主动私信

看你的问题是 h5 运行到 ios 微信内置浏览器。我使用 HBuilderX alpha 最新版 + vue3 运行表现正常。你存到具体是什么值?我测试空字符串、null、undefined 都正常,你的应用在 pc 上表现正常吗?直接使用 localStroage 表现是否正常

提供个复现工程,提供更多信息,有助于定位和解答你的问题。

要回复问题请先登录注册