IOS调用uni-app的uni.chooseImage()时app应用会闪退没有任何报错

IOS调用uni-app的uni.chooseImage()时app应用会闪退没有任何报错

信息类别 详情
产品分类 uniapp/App
PC开发环境 Windows
PC版本号 win11
HBuilderX 正式
HBuilderX版本号 4.76
手机系统 iOS
手机版本号 iOS 18
手机厂商 苹果
手机机型 iphone15
页面类型 vue
vue版本 vue2
打包方式 云端
项目创建方式 HBuilderX

示例代码:

uni.chooseImage({
	count: 9,
	sizeType: ['compressed'],
	sourceType:['album'],
	success: async (res) => {
		for (let i = 0; i < res.tempFiles.length; i++) {
			if (res.tempFiles[i].size / 1024 / 1024 > 50) {
				uni.showToast({
					icon: "none",
					title: "上传图片最大为50M!"
				})
				continue;
			}
			await uploadFileChatApi(res.tempFiles[i].path).then(resp => {
				this.handleSend({
					message: resp.data.url,
					type: 3,
					imType: that.isModeChat ? 1 : 2
				})
			})
		}
		that.isModeChat = true;
	}
}

操作步骤:

  • 附件视频

预期结果:

  • 连续多次上传图片时可正常调取相册、勾选图片,应用无崩溃、闪退现象,能顺利完成附件上传

实际结果:

  • 多次操作后,会频繁闪退。

bug描述:

设备IOS版本为18.6.2, 调用uni.chooseImage()选择图片-图库,受限访问部分图片时,多次调用上传后 会应用闪退。 完全访问时,暂时正常。

附件

弹窗video.zip


更多关于IOS调用uni-app的uni.chooseImage()时app应用会闪退没有任何报错的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

该bug反馈内容基本完整但存在不足:问题描述说明了iOS 18.6.2设备上调用uni.chooseImage()时受限图片访问导致闪退的现象,但未明确具体图片类型/操作次数等关键细节;代码示例展示了核心逻辑但缺少uploadFileChatApi实现和完整上下文;复现步骤仅提及"附件视频"但未提供具体操作流程,难以精准复现;分类信息包含必要环境数据(HBuilderX 4.76/iOS 18),但未说明是否尝试最新版。预期结果合理,实际闪退属异常行为。
经核查知识库,该bug很可能成立:知识库显示iOS平台存在多例相关修复(如"App-iOS平台 修复 组件 canvas 反复退出进入应用偶发闪退"[链接]),且特别注明"iOS平台 更新 云端打包环境 XCode 为 16.1 版、iOS SDK 为 18.1 版"。用户使用的HBuilderX 4.76版本较旧(当前最新为4.36+系列),而iOS 18.6.2属于高版本系统,可能存在SDK兼容性缺陷。知识库中"uni.getWindowInfo在iPhone18设备获取的屏幕宽、高可能不正确"[链接]等记录进一步佐证iOS 18适配问题。
非基础概念问题,属平台兼容性范畴。建议用户:1) 升级至HBuilderX最新正式版(至少4.36+);2) 检查相册权限配置,参考uni-app权限管理指南;3) 简化测试代码排除业务逻辑干扰;4) 若仍复现,需补充具体复现步骤及Xcode日志供深度分析。 内容为 AI 生成,仅供参考

更多关于IOS调用uni-app的uni.chooseImage()时app应用会闪退没有任何报错的实战教程也可以访问 https://www.itying.com/category-93-b0.html


uploadFileChatApi()为文件上传接口,常规的上传操作,上传后在页面显示文件列表。 具体复现步骤:

IOS设备调用uni.chooseImage(),访问权限选择 受限图片访问。
选择4-5张图片后确定,上传后保存url在页面,显示图片列表。
连续多次1、2操作后,app应用会闪退,也没有报错提示。(约连续操作6次左右)

这是一个典型的iOS权限问题导致的闪退。当应用只有"受限访问"相册权限时,频繁调用uni.chooseImage()选择图片会触发系统内存管理机制,导致应用被系统强制终止。

核心原因: iOS系统在"受限访问"模式下,每次调用相册选择器都需要重新验证权限并加载受限的图片资源。频繁操作会导致:

  1. 内存峰值过高,超出iOS内存警告阈值
  2. 系统相册框架资源未及时释放
  3. 权限验证堆栈累积

解决方案:

  1. 优化调用频率 - 添加防抖机制:
let isChoosing = false
function chooseImage() {
    if (isChoosing) return
    isChoosing = true
    
    uni.chooseImage({
        // ...配置
        complete: () => {
            setTimeout(() => {
                isChoosing = false
            }, 500)
        }
    })
}
  1. 分批处理大文件 - 避免内存峰值:
success: async (res) => {
    for (let i = 0; i < res.tempFiles.length; i++) {
        // 添加延迟避免同时处理多个大文件
        if (i > 0) await new Promise(resolve => setTimeout(resolve, 100))
        
        // 文件大小检查
        if (res.tempFiles[i].size > 50 * 1024 * 1024) {
            uni.showToast({ title: "图片最大50M" })
            continue
        }
        
        // 上传逻辑
        await uploadFileChatApi(res.tempFiles[i].path)
    }
}
  1. 检查manifest配置: 确保manifest.json中已正确配置相册权限描述:
"ios": {
    "permissions": {
        "PhotoLibrary": {
            "description": "需要访问相册以选择图片"
        }
    }
}
  1. 升级HBuilderX: 当前版本4.76较旧,建议升级到最新稳定版(4.27+),新版对iOS 18有更好的兼容性。

  2. 临时规避方案: 引导用户将相册权限改为"完全访问",或在调用前检查权限状态:

uni.getSetting({
    success: (res) => {
        if (res.authSetting['scope.album'] === 'limited') {
            uni.showModal({
                title: '提示',
                content: '受限访问可能导致闪退,建议改为完全访问',
                showCancel: false
            })
        }
    }
})
回到顶部