uni-app API uni.makePhoneCall 报Bug

uni-app API uni.makePhoneCall 报Bug

开发环境 版本号 项目创建方式
Windows win10 19042.610 HBuilderX
### 示例代码:

```jsx
uni.makePhoneCall({  
  phoneNumber: "10086", // 建议类型不要限制为string.而是在接口内部将传递过来的数据转化为string 例如 toString()  
  success() {  // 在没有拨打电话环境下,例如PC,也将调用此方法.  
    uni.showToast({ title: "拨打电话成功" });  
    let t = setTimeout(() => {  
      clearTimeout(t);  
      uni.hideToast();  
    }, 2000);  
  },  
  fail() {  
    uni.showToast({ title: "拨打电话失败" });  
    let t = setTimeout(() => {  
      clearTimeout(t);  
      uni.hideToast();  
    }, 2000);  
  }  
});

操作步骤:

如代码所示.

预期结果:

拥有拨打环境 才调用success(不管用户是否真正拨打电话);

实际结果:

在h5环境中.全部调用了success

bug描述:

uni.makePhoneCall 这个api在PC浏览器(以及其他没有拨打电话功能的环境)中, 将电话号码设置为文本后,均调用success,如果电话号码为整数,小数.在所有环境下(无论是否有拨打电话的环境)则均调用fail;

正确逻辑应该是 拥有拨打环境 才调用success(不管用户是否真正拨打电话);


更多关于uni-app API uni.makePhoneCall 报Bug的实战教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

由于浏览器的限制,无法判断是否拥有拨打环境

更多关于uni-app API uni.makePhoneCall 报Bug的实战教程也可以访问 https://www.itying.com/category-93-b0.html


关于uni.makePhoneCall在H5环境下的行为问题,这确实是API设计上的一个缺陷。在H5平台,由于浏览器没有直接拨打电话的能力,该API的实现逻辑需要优化:

  1. 当前H5平台的处理方式确实不够严谨,无论环境是否支持拨号都会触发success回调,这不符合预期行为。

  2. 建议的修正方案应该是:

  • 在调用API时先检测运行环境是否支持电话功能
  • 对于不支持的平台(如PC浏览器),应该直接触发fail回调
  • 参数类型处理也应当统一,内部做toString转换
  1. 临时解决方案:
function safeMakePhoneCall(num) {
  if(!uni.canMakePhoneCall) { // 自行判断环境
    console.log('当前环境不支持拨打电话');
    return;
  }
  uni.makePhoneCall({
    phoneNumber: String(num),
    success() {
      // 真实支持拨号的环境才会进入
    },
    fail() {
      // 处理失败情况
    }
  });
}
回到顶部