uni.chooseMedia是官方推荐替代uni.chooseImage的API,因iOS系统限制WebView无法唤起纯相册界面,uni.chooseImage在iOS上对['album']会降级为先调相机且已弃用;正确做法是显式传mediaType:['image']和sourceType:['album'],取路径用res.tempFiles[0].tempFilePath,并用uni.uploadFile上传。

直接用 uni.chooseMedia,传 mediaType: ['image'] 和 sourceType: ['album'],别再用 uni.chooseImage —— 它在 iOS 上根本不会弹相册,而是静默跳转相机,且已官方弃用。
为什么 uni.chooseImage 在 iOS 上不弹相册?
iOS 系统限制 WebView 层无法直接唤起纯相册选择界面,uni.chooseImage 在 iOS 真机上遇到 sourceType: ['album'] 会降级为先调用相机;即使写空数组或省略 sourceType,行为更不可控。这不是 bug,是原生平台策略。
-
sourceType: ['camera']在 iOS 上能正常工作(调起相机) -
sourceType: ['album']在 iOS 上大概率失效,Android 和小程序则表现正常 - H5 端始终走
,样式和交互完全不可控,别指望它像 App 那样弹系统相册
uni.chooseMedia 怎么正确调用相册选图?
必须显式声明 mediaType 和 sourceType,否则 iOS 仍可能默认允许选视频或跳转相机。
- 只选图片:
mediaType: ['image'](必加,不加 iOS 可能弹出视频选项) - 仅限相册:
sourceType: ['album'](不能是字符串,也不能省略) - 单图场景建议加
count: 1,避免 iOS 多选后只取第一个却无提示 - 压缩控制:
compressionQuality: 0.8仅在 App 端(iOS/Android)生效,H5 完全忽略
示例:
uni.chooseMedia({
mediaType: ['image'],
sourceType: ['album'],
count: 1,
compressionQuality: 0.8,
success: (res) => {
const path = res.tempFiles[0].tempFilePath;
// 直接赋给 <image :src="path"> 即可预览
},
fail: (err) => {
if (err.errMsg.includes('auth deny')) {
uni.showToast({ title: '请开启相册权限', icon: 'none' });
} else if (err.errMsg.includes('cancel')) {
// 用户点了取消,无需报错,安静退出即可
}
}
});
</image>
失败回调里怎么区分「取消」和「拒绝权限」?
不能只靠 try/catch 或判断 res 是否为空——这两个场景都会进 fail 回调,但处理方式完全不同。
- 拒绝权限:
err.errMsg通常是"chooseMedia:fail auth deny"(iOS/Android)或"getUserMedia:fail NotAllowedError"(H5) - 用户手动取消:
err.errMsg多为"chooseMedia:fail cancel",此时不该弹错误提示,应静默退出 - 真机调试 iOS 必须开启
NSPhotoLibraryUsageDescription权限描述,否则连授权弹窗都不会出现
路径取值和上传前要注意什么?
uni.chooseMedia 返回结构和旧 API 完全不同,老代码里写 res.tempFilePaths[0] 会直接报错。
- 正确取图路径:
res.tempFiles[0].tempFilePath(完整图)或res.tempFiles[0].thumbTempFile?.tempFilePath(缩略图,H5 可能为undefined) - 上传必须用
uni.uploadFile,filePath参数填的就是上面那个tempFilePath,不是 base64 - 安卓部分相册路径含空格或特殊字符,
uploadFile可能静默失败,可兜底用uni.getFileSystemManager().readFile转 base64(仅限小图) - 临时文件有效期仅限本次 App 启动周期,上传完如需持久化,得主动调
uni.saveFile
最常被忽略的是:H5 端永远没有“系统相册”概念,它就是个文件选择按钮;而 iOS 真机未配权限描述、未开相册权限时,chooseMedia 会直接进 fail 且不抛任何明确错误,只能靠 errMsg 字符串匹配来识别。











