Android端HTML tel链接携带USSD代码时加号丢失问题咨询
Android 端 tel 链接丢失拨号串中
+字符的解决方案 问题根因
双端解析逻辑存在差异是问题出现的核心原因:
- iOS的WebKit引擎严格遵循RFC3966电话URI规范解析链接,可正确还原转义后的
+字符,因此相同链接在iOS上表现正常 - 部分Android系统、内置浏览器未遵循该规范,沿用传统HTTP URL的解析规则,将编码位置的
+按照空格语义做了过滤/替换;加之原写法仅对+、#做了零散转义,未对拨号串内所有特殊字符做统一编码,放大了解析异常的概率,最终传入拨号器的内容丢失了+字符,与预期不符。
兼容实现方案
- 按照RFC3966规范对完整拨号串做全量逐字符编码,避免零散手动转义:
各特殊字符的对应编码为:- 数字字符无需编码
*编码为%2A+编码为%2B#编码为%23
针对目标USSD串**67*+111#,最终生成的标准兼容链接为:
<a href="tel:%2A%2A67%2A%2B111%2A%23">唤起USSD拨号</a> - 老旧定制Android系统的兼容兜底:
部分4.x~7.x版本的第三方定制ROM对%2B的解析存在已知bug,可对+的编码做二次转义,让浏览器解析一轮后还原为拨号器可识别的编码值,对应写法为:<a href="tel:%2A%2A67%2A%252B111%2A%23">唤起USSD拨号</a> - 链接格式注意事项:
不要在tel链接中附加任何查询参数(如带?的附加字段),部分Android系统遇到带查询段的tel链接时,会直接截断特殊字符的解析逻辑,提升字符丢失的概率。
内容的提问来源于stack exchange,提问作者Rabochiy Rabochiy
相关产品推荐
相关产品推荐

