uni.makePhoneCall 仅在 App(iOS/Android)和 MP-WEIXIN(微信小程序,基础库≥2.10.0)生效;H5 静默不触发,需用 tel: 链接;支付宝小程序需用 my.makePhoneCall;App 安卓须配置权限并主动授权;小程序需检查 scope.phoneNumber。

直接用 uni.makePhoneCall 调不通,不是代码写错了,而是你没分清平台——H5 根本不支持这个 API,App 端缺权限会静默失败,小程序拒绝一次后就再也不会弹框。必须按平台拆开处理。
uni.makePhoneCall 在哪些平台真正生效
这个 API 表面跨端,实际只在两个环境起作用:App(iOS/Android)和 MP-WEIXIN(微信小程序,基础库 ≥ 2.10.0)。其他平台表现如下:
- H5:完全静默,
success/fail回调都不会触发,控制台无报错 - 支付宝小程序:需用
my.makePhoneCall,且要声明权限 - App 端 iOS:
scope.callPhone仅作兼容占位,系统不校验,但 Android 必须真授权 - uni-app 的
plus.dial是 App 专属替代方案,可绕过拨号界面直接拨出(第二个参数设为false),但 iOS 不支持
H5 页面必须用 <a href="tel:13800138000"></a> 协议
浏览器无法调原生拨号,唯一可靠方式是 HTML 的 tel: 协议链接。常见错误包括:
- 用
<button></button>触发 JS —— 浏览器不认,无效 - 号码含空格、横线、括号(如
"400-123-4567")→ 改成"4001234567",否则部分 Android 机型识别失败 - 没加
rel="noopener"和target="_self"→ 某些 WebView 下跳转异常或新开 tab
正确写法示例:<a href="tel:13800138000" rel="noopener" target="_self">拨打客服</a>
App 端必须检查并处理 scope.callPhone 权限
Android 11(API 30)起,未声明或未获授权时,uni.makePhoneCall 会静默失败,用户点按钮毫无反应。关键动作有三步:
- manifest.json 中「Android 设置」→「权限配置」勾选「拨打电话」
- 调用前先查权限:
uni.authorize({ scope: 'scope.callPhone' })(iOS 可跳过,但建议统一写) - 若拒绝,必须调
uni.openSetting()跳转系统设置页——这是安卓用户“点了没反应”的最常见根因
注意:uni.getSetting 返回的 authSetting['scope.callPhone'] 在 Android 上可能为 undefined,应 fallback 到 uni.authorize 主动触发弹窗。
小程序需前置检查 authSetting['scope.phoneNumber']
微信小程序不会在用户拒绝后再次弹授权框,后续调用直接走 fail。不能只等 uni.makePhoneCall 报错才提示,而要提前查状态:
- 用
uni.getSetting获取authSetting['scope.phoneNumber'](注意字段名是phoneNumber,不是callPhone) - 值为
undefined或denied时,弹uni.showModal引导用户去「设置 > 权限管理」手动开启 - 号码传入前务必清洗:
phoneNumber.replace(/[^0-9]/g, '')
条件编译写法必须严格:// #ifdef MP-WEIXIN 包裹 wx.makePhoneCall,否则 HBuilderX 编译会报错。
最容易被忽略的是:三端失败现象完全一样(点击无反应),但排查路径完全不同——H5 查 DOM 链接,App 查 manifest + openSetting 是否触发,小程序查 authSetting 字段名和基础库版本。别指望一个 API 走到底。


















