苹果系统 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 回复
这个错误通常出现在iOS系统的隐私模式下,当用户开启了"阻止跨站跟踪"或"无痕浏览"时,localStorage会被禁用。在uni-app中,需要注意以下几点:
-
uni.setStorageSync在iOS上底层实现可能依赖localStorage,当隐私模式开启时会报错
-
解决方案:
- 使用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);
// 可以考虑使用其他持久化方案,如写入文件
}
};