uni.makePhoneCall仅在App和小程序生效,H5需用;App端须配置权限并检查scope.callPhone;小程序需满足基础库版本要求。

直接用 uni.makePhoneCall 就能调起拨号盘,但只在 App 和小程序生效;H5 必须换方案,否则点不动、没报错、用户以为功能坏了。
App 端调用 uni.makePhoneCall 前必须检查权限
Android 上哪怕只是弹出拨号盘(不自动拨打),也得声明 CALL_PHONE 权限,否则真机打包后静默失败。iOS 虽不强制运行时申请,但 manifest.json 里仍要勾选「拨打电话」权限项,否则某些 iOS 版本会拒绝唤起。
- manifest.json 的
app-plus.distribute.android.permissions必须包含"android.permission.CALL_PHONE" - 调用前建议加权限检查:
uni.authorize({ scope: 'scope.callPhone' }),失败时用uni.openSetting()引导用户手动开启 - 注意:Android 11+(API 30)起,即使代码写了,没权限也会完全无反应,控制台也不报错
H5 页面不能用 uni.makePhoneCall,必须用 <a href="tel:13800138000"></a>
浏览器根本不支持 JS 直接唤起拨号界面,uni.makePhoneCall 在 H5 下是静默失效——既不弹窗也不报错,按钮像坏了一样。唯一可靠方式是 HTML 的 tel: 协议链接。
- 必须用
<a></a>标签,<button></button>+ JS 拼接跳转无效 - 号码只能含数字,
138-0013-8000或(138) 0013-8000会导致部分 Android 机型识别失败 - 建议加
rel="noopener"和target="_self"防止页面异常跳转或新开 tab
小程序端要注意基础库版本和平台差异
微信小程序用 uni.makePhoneCall 实际走的是 wx.makePhoneCall,但要求基础库 ≥ 2.10.0;支付宝小程序同理,但文档未明确最低版本,实测 3.0+ 更稳。如果用户基础库太旧,调用会直接进 fail 回调。
- 别假设所有用户都更新了微信,加个
fail提示比空白更友好 - 小程序不涉及系统权限申请,但
phoneNumber为空或格式错误时,fail回调的err.errMsg可能是"makePhoneCall:fail parameter error" - 不要在小程序里尝试
plus.dial,它只在 5+ App 环境下存在,小程序中会报plus is not defined
最容易被忽略的是:不同平台的拨号行为本质不同——App 端弹的是系统原生拨号盘,小程序弹的是平台内置界面,H5 则完全依赖浏览器实现。同一套逻辑硬套三端,大概率在某一个端彻底失灵。别省那几行条件编译,该分就分。


















