苹果系统 uni-app uni.setStorageSync()api 存储报错null is not an object (evaluating 'localStorage.setltem')

苹果系统 uni-app uni.setStorageSync()api 存储报错null is not an object (evaluating ‘localStorage.setltem’)

示例代码:

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’);开发者工具测试正常,安卓系统测试正常;


更多关于苹果系统 uni-app uni.setStorageSync()api 存储报错null is not an object (evaluating 'localStorage.setltem')的实战教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

看你的问题是 h5 运行到 ios 微信内置浏览器。我使用 HBuilderX alpha 最新版 + vue3 运行表现正常。你存到具体是什么值?我测试空字符串、null、undefined 都正常,你的应用在 pc 上表现正常吗?直接使用 localStroage 表现是否正常
提供个复现工程,提供更多信息,有助于定位和解答你的问题。

更多关于苹果系统 uni-app uni.setStorageSync()api 存储报错null is not an object (evaluating 'localStorage.setltem')的实战教程也可以访问 https://www.itying.com/category-93-b0.html


这个错误通常出现在iOS系统的隐私模式下,当用户开启了"阻止跨站跟踪"或"无痕浏览"时,localStorage会被禁用。在uni-app中,需要注意以下几点:

  1. uni.setStorageSync在iOS上底层实现可能依赖localStorage,当隐私模式开启时会报错

  2. 解决方案:

  • 使用try-catch包裹存储操作
  • 检查运行环境是否支持存储

修改后的代码建议:

export const setUserInfo = (userInfo) => {
    const { token, ...uInfo } = userInfo;
    try {
        if (!uInfo) throw new Error('uInfo不能为空');
        
        // 优先使用uni-app的存储API
        if(typeof uni !== 'undefined' && uni.setStorageSync) {
            uni.setStorageSync('uInfo', uInfo);
        } else {
            // 备用方案
            console.warn('uni API不可用,尝试使用其他存储方式');
        }
    } catch (error) {
        console.error('存储失败:', error);
        // 可以考虑使用其他持久化方案,如写入文件
    }
};
回到顶部