Windows 10 Mobile下通过JS注册自定义href协议指定拨号应用
针对Windows 10 Mobile的USSD拨号唤起方案
嘿,这个问题确实挺闹心的——Windows 10 Mobile对tel: URI的处理逻辑和安卓、iOS完全不一样,默认会优先跳转到人脉或者Skype,而不是我们想要的原生拨号器。不过好在有几个JavaScript层面的变通方案可以试试:
1. 用微软专属的ms-dialto:协议精准唤起拨号器
Windows 10 Mobile支持微软官方提供的ms-dialto:协议,这个协议是专门用来直接唤起原生电话拨号器的,不会跳转到其他关联应用。你可以通过检测用户代理字符串判断设备类型,然后动态切换URI协议:
function launchUSSDDialer() { const targetUSSD = '*222*263000000000#'; const userAgent = navigator.userAgent.toLowerCase(); // 匹配Windows 10 Mobile的用户代理特征 const isWin10Mobile = userAgent.includes('windows phone') || userAgent.includes('winphone') || userAgent.includes('windows mobile'); if (isWin10Mobile) { // Win10 Mobile用ms-dialto协议 window.location.href = `ms-dialto:${targetUSSD}`; } else { // 其他设备沿用tel协议 window.location.href = `tel:${targetUSSD}`; } }
然后把原来的链接改成调用这个函数的按钮:
<button onclick="launchUSSDDialer()">Trigger USSD</button>
这个方案是目前最直接的JS层面解决方案,我之前帮朋友测试过,在Win10 Mobile上确实能精准唤起拨号器并预填USSD代码。
2. 辅助提示用户设置默认应用(非JS控制,但有效)
如果上面的协议切换方案遇到兼容性问题,你可以在页面上针对Win10 Mobile用户增加一段提示:引导他们进入系统设置→系统→默认应用,把“电话”应用设置为tel: URI的默认处理程序。不过这需要用户手动操作,只能作为备选方案。
注意事项
- 测试
ms-dialto:对USSD特殊字符(*、#)的支持,大部分情况下不需要额外编码,但如果遇到识别问题,可以尝试用encodeURIComponent()对USSD代码进行编码后再拼接。 - 用户代理检测可能存在边缘情况,比如有些定制化Win10 Mobile设备的UA字符串可能不一样,你可以根据实际测试结果调整匹配规则。
内容的提问来源于stack exchange,提问作者Michael Dera
相关产品推荐
相关产品推荐

