不能直接发短信,href="sms:"仅触发短信应用新建草稿界面。标准格式为sms:number?body=text,需url编码,ios支持完整协议,android部分定制系统忽略body,桌面端基本不支持,号码须无空格横线括号。

href="sms:" 能不能直接发短信
不能。写 href="sms:+8613800138000" 只会触发系统默认短信应用的「新建草稿」界面,不会自动发送——这是浏览器安全机制决定的,任何网页都无权绕过用户确认直接发短信。
sms: 协议的正确写法和兼容性
标准格式是 sms:NUMBER?body=TEXT,其中 NUMBER 可带国际区号(如 +8613800138000),body 参数需 URL 编码。但要注意:
- iOS Safari 支持完整协议,包括带
body的预填充; - Android Chrome 大部分机型支持,但部分国产定制系统(如华为 EMUI、小米 MIUI)会忽略
body或直接跳转失败; - 桌面端浏览器基本不处理
sms:,点击后可能无响应或报错Unknown protocol; - 号码里不能有空格、横线、括号,否则 iOS 会拒绝解析。
常见错误:href 写错导致点击无效
最容易踩的坑是 URL 编码没做或做错。比如想发「你好,订单已发货」,直接写:
href="sms:+8613800138000?body=你好,订单已发货"
这在多数 Android 上会失败。正确做法是用 encodeURIComponent() 编码正文:
<a href="sms:+8613800138000?body=%E4%BD%A0%E5%A5%BD%EF%BC%8C%E8%AE%A2%E5%8D%95%E5%B7%B2%E5%8F%91%E8%B4%A7">发短信</a>
另外注意:sms: 后不能加空格,? 前不能有空格,参数名必须小写 body(不是 Body 或 message)。
要不要加 JavaScript fallback?
纯 sms: 链接在桌面端或不支持设备上静默失效,用户毫无感知。如果业务强依赖短信入口,建议检测环境后降级:
- 用
navigator.userAgent粗略判断是否为移动端; - 对不支持的场景,改用弹出提示 + 手动复制号码的方案;
- 不要试图用
window.open("sms:...")—— 这在绝大多数浏览器里被拦截,且 iOS 完全不认; - 避免监听
a标签的click后再调window.location.href = "sms:...",这反而增加失败概率。
真正难处理的是国产安卓的碎片化:同一款 App 在不同厂商系统上行为不一致,测试时得真机覆盖华为、OPPO、vivo、小米各一两台。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











