即使发送方更早提交了短信,手机重新连接后仍然可以收到它。
存储转发是什么意思?
消息中心在尝试将短信投递到手机之前先保存它。
网络接受消息并不意味着手机已经收到短信。关机或不可达的手机会导致消息处于等待状态。手机重新连接后可以再次尝试投递。消息必须在该次尝试时仍然有效。
3GPP 规范 23.040 描述了消息中心在 SMS 中的角色。
消息可以等待多长时间?
在消息的投递窗口仍然有效期间,网络可以继续尝试投递。该窗口称为有效期。
SMS 标准允许发送方指定有效期。你的服务商决定是否允许你通过其 API 设置该值。
当该窗口关闭时,投递可能以过期结束。过期报告并不意味着最初的发送请求失败了。
对于时间敏感的流程,应用本身的截止时间仍然需要强制执行。如果一个验证码的有效期为十分钟,但在四小时后才送达,你的服务器必须拒绝它。迟到的短信不能延长它所描述的操作的生命周期。
消息中心相对于我的应用在哪里?
你的应用可以通过消息服务商连接消息中心,而不必自行管理运营商连接。
服务商使用 SMPP 将短信传递给消息中心,可以直接传递,也可以通过其他路由服务。SMPP 参考文档描述了这些连接。
你的服务商可以在下一个网络服务接受消息之前就确认请求。消息中心随后可以在手机收到短信之前接受它。每次确认描述的是传输过程中的一个阶段。
已接受但未投递解释了这些阶段在应用中的表现。
通过 Bird 我可以观察到什么?
你可以查看运营商交接和已报告的投递状态,而无需自行连接消息中心。
消息响应的 sent_at 记录 Bird 将消息交给运营商的时间。delivered_at 记录确认投递的时间。两个字段都包含时间戳或 null。投递时间缺失并不意味着手机拒绝了短信。
Bird 的发送端点会以 HTTP 422 SMSUnsupportedFeature 拒绝 validity_period。你无法通过该字段设置运营商的保留窗口。响应不会返回该字段。
Bird 在运营商报告过期时发出 sms.expired。缓冲回执(即运营商暂存短信)不会产生公开的状态变化。投递回执解释了哪些网络报告会到达你的应用。
这对发送流程有什么影响?
你的应用需要将投递作为一个后续事件来处理,其结果独立于提交。
将待定结果与失败区分开。在你的应用中对验证码和其他时间敏感操作强制执行截止时间。将投递回执视为网络对投递的报告,它并不能证明有人阅读了短信。
简而言之
接受与投递是分开的。
消息中心可以在收件人手机可达之前就接受短信。
存储为投递提供了再次机会。
等待中的短信可以在手机重新连接后送达,前提是投递窗口仍然有效。
投递窗口是有限的。
当等待期结束时,网络可以报告消息过期。
你的集成无需直接连接。
消息服务商可以处理你的应用与运营商网络之间的连接。