uni-app ios13.3.1、ios14.6手机safari浏览器中uni.chooseImage不生效

uni-app ios13.3.1、ios14.6手机safari浏览器中uni.chooseImage不生效

开发环境 版本号 项目创建方式
HBuilderX 3.2.2 离线

操作步骤:

uni.chooseImage({  
   count: maxNum - filePaths.length,  
   extension: extension,  
   sizeType: ['compressed'], //限制只传压缩图,保证小于10Mb  
   success: res => {  
   },  
   fail: res => {  
      console.log('choose Image err:' + res)  
   }  
})

预期结果:

  • 使用相册或相机,

实际结果:

  • 无任何反应, 无报错

bug描述:

调用uni.chooseImage选择图片钩子不生效,毫无反应,控制台没报错,同样的代码在Android下正常运行。

uni.chooseImage({  
   count: maxNum - filePaths.length,  
   extension: extension,  
   sizeType: ['compressed'], //限制只传压缩图,保证小于10Mb  
   success: res => {  
   },  
   fail: res => {  
      console.log('choose Image err:' + res)  
   }  
})

更多关于uni-app ios13.3.1、ios14.6手机safari浏览器中uni.chooseImage不生效的实战教程也可以访问 https://www.itying.com/category-93-b0.html

11 回复

使用不同版本的 uni-app 测试表现是否相同?
另外 Safari 浏览器中表现是否正常?

更多关于uni-app ios13.3.1、ios14.6手机safari浏览器中uni.chooseImage不生效的实战教程也可以访问 https://www.itying.com/category-93-b0.html


目前是在3.2.2,3.2.3版本使用过, 都是一样的, ios的safari种没反应,

回复 橘子桔子: 检查一下你的 extension

回复 DCloud_UNI_GSQ: 搞明白了,不是参数的问题, 我们项目需求,每个用户有资源上传的数量限制,在上传之前查询一次是否还能上传。 我把方法写在App.vue里, 用了new Promise()返回值, 之后如果还能上传就会调用uni.chooseImage(). 在这样的流程下就会导致choose Image无反应。

当时如果把检测是否还有剩余资源写在当前页面, 不用Promise就没问题。

应该算是个bug了,只会出现在ios的safari上的bug

回复 橘子桔子: 苹果要求选择文件由用户直接触发(异步不可以),后续会分析一下这种情况能否判断出并触发失败。

回复 DCloud_UNI_GSQ: 并非异步打开choose Image的。 调用的基本代码结构如下。 // app.vue async checkData(){ new Promise() } // page async MainFn(){ await getApp().checkData(): await getApp().choosePhoto(); }

回复 橘子桔子: 翻译一下 async 是什么意思

回复 DCloud_UNI_GSQ: 哈哈哈哈哈哈

根据你的描述,这是一个典型的iOS Safari浏览器权限问题。在iOS 13+的Safari中,uni.chooseImage(底层调用的是<input type="file">)必须在用户交互的直接响应中触发,否则会被浏览器安全策略拦截。

核心原因:iOS Safari对文件选择器的调用有严格的用户手势要求。如果你的uni.chooseImage调用被包裹在异步回调、定时器或非直接触发的逻辑中,它就会静默失败。

解决方案

  1. 确保直接绑定到用户操作: 将uni.chooseImage直接绑定到按钮的[@tap](/user/tap)事件,避免在setTimeoutPromise.then或异步请求回调中调用。

    // ✅ 正确示例
    <button [@tap](/user/tap)="chooseImage">选择图片</button>
    
    methods: {
      chooseImage() {
        uni.chooseImage({
          count: 1,
          success: (res) => {
            console.log(res.tempFilePaths);
          }
        });
      }
    }
回到顶部