uni-app IOS 退出后台挂了近一个小时 再进入APP后部分图片显示空白
uni-app IOS 退出后台挂了近一个小时 再进入APP后部分图片显示空白
开发环境 | 版本号 | 项目创建方式 |
---|---|---|
Windows | Win11 | HBuilderX |
操作步骤:
- APP挂在后台后,10分钟、半分钟返回APP图片都没有问题,过了快一个小时后进入APP后大部分图片资源都缺失了变空白了
预期结果:
- 图片资源不会消失白屏
实际结果:
- 图片变成空白了
bug描述:
- uniapp IOS 退出后台挂了快一个小时 在进入APP后部分图片变成空白了
急,有人知道这是什么原因吗?
对,其他内容都有。能够看到我上传的压缩包文件吗?里面有视频。
我这里不只是图片,页面的样式也会失效
楼主方便的话,加个QQ讨论一下。
可以的,1213563369
回复 1***@qq.com: 好的。
你好 这种情况可能是由于内存或资源不足导致的图片加载问题。你可以尝试在进入APP后重新加载这些空白图片,或者检查一下你的图片资源是否被释放或清除了
你好,我也考虑过是这个问题,我应该怎么做能去检查图片资源是否被释放或者是清除呢?
这个问题基本确定就是内存使用过大时系统会将处于后台中的 webview 进程终止,回到前台后uniapp做了webview白屏恢复的机制,但是不能保证所有内容都能正常恢复,可以加个逻辑判断一下 image 组件的 src 是否存在,是否能正常获取图片的size,如果不能正常获取就直接刷新一下当前页面试试看
好滴,感谢
全部都是白屏 怎么解决呢
回复 1***@qq.com: 解决了么,大佬?
同问什么问题。
坑的一批,现在公司的uni-app项目,要么不出问题,出问题基本就是类似这种大坑问题,烦的要死。
只能等官方回答。
难顶
你用的是原生的image组件,还是用的组件库的图片组件?
回复 1***@qq.com: 都试过,都不行
不仅是图片,在ios端页面的样式app在后台运行一段时间以后从新进入也会失效
同问,后台挂起几个小时后,首页商品的图片都消失了。
目前通过以下兼容方案,处理了页面 图片或样式消失的问题。测试有效。
// app.vue
onHide() {
console.log(“App Hide”);
useAppStore().setHide(true)
},
async onShow() {
// 获取当前页面路由
let page = currentPage()
let route = page['__route__']
// 判断页面是否是通过后台进入,并且是ios平台
if(useAppStore().isHide?.val && $platform.os == 'ios') {
let hideTime = useAppStore().isHide?.time
// 页面隐藏30分钟内,不重新加载,时间是随意加的,ios预计是2小时左右会显示不出来图片
if(Date.now() - hideTime < 30 * 60 * 1000) {
return
}
useAppStore().setHide(false)
let nav_type = route == 'page/index/index' ? 'reLaunch' : 'redirectTo'
navigateTo({path: `/${route}`}, nav_type)
}
},<br>
针对您提到的uni-app在iOS设备上退出后台挂起近一个小时后,再次进入APP发现部分图片显示空白的问题,这通常可能是由于图片资源的缓存管理不当或内存管理问题导致的。以下是一些可能的解决方案和代码示例,用于优化图片加载和缓存管理。
1. 使用image
组件的lazy-load
属性
确保图片组件使用了懒加载属性,这可以减少内存占用并优化图片加载性能。
<image src="path/to/image.jpg" mode="aspectFill" lazy-load="true"></image>
2. 图片缓存策略
可以通过设置HTTP请求头来控制图片的缓存策略,确保图片在缓存有效期内能被正确加载。
uni.request({
url: 'https://example.com/image.jpg',
method: 'GET',
header: {
'Cache-Control': 'public, max-age=3600' // 设置缓存有效期为1小时
},
success: (res) => {
const base64Image = 'data:image/jpeg;base64,' + uni.arrayBufferToBase64(res.data);
// 将base64编码的图片设置给image组件的src属性
this.imageData = base64Image;
}
});
3. 本地缓存图片
对于关键图片,可以考虑将它们缓存在本地,使用uni.saveFile
和uni.getFileSystemManager
来管理本地文件。
const fs = uni.getFileSystemManager();
const tempFilePath = `${wx.env.USER_DATA_PATH}/image.jpg`;
// 保存图片到本地
fs.writeFile({
filePath: tempFilePath,
data: res.data, // 假设res.data是图片的ArrayBuffer
encoding: 'binary',
success: () => {
// 使用本地路径加载图片
this.localImagePath = tempFilePath;
}
});
4. 清理无效缓存
在应用启动时或定期清理无效的缓存图片,可以使用uni.removeSavedFile
。
uni.getSavedFileInfo({
filePath: tempFilePath, // 需要检查的文件路径
success: (res) => {
if (!res.exists) {
// 文件不存在,可能需要重新下载或显示占位图
this.localImagePath = ''; // 或设置为占位图路径
}
}
});
5. 监控内存使用
虽然uni-app没有直接的API来监控内存使用,但可以通过性能监控工具(如Xcode的Instruments)来分析应用的内存使用情况,并根据分析结果调整图片加载和缓存策略。
通过上述方法,您可以尝试解决图片显示空白的问题。如果问题依旧存在,建议深入分析应用的内存使用情况和图片加载逻辑,以找到根本原因。