You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Native使用Linking发送SMS时如何判断短信是已发送还是已取消

结论先行

你当前基于Linking.openURL实现的短信发送逻辑,无法直接获取用户发送成功/取消发送的状态:Linking.openURL仅负责跳转系统短信应用,await返回仅代表「跳转动作执行完成」,不包含后续用户在短信应用内的操作结果,只有跳转失败(比如设备无短信功能、权限缺失)时才会进入catch逻辑。


可行实现方案

方案1:使用react-native-sms第三方库(推荐)

该库原生封装了iOS的MFMessageComposeViewController和Android的短信发送Intent,原生层已经实现了状态监听逻辑,可直接返回用户操作结果,使用示例:

import SMS from 'react-native-sms';

const sendSMS = (phoneNumber, message) => {
  SMS.send(
    {
      body: message,
      recipients: [phoneNumber],
      // Android下可配置将已进入发送队列的短信判定为成功
      successTypes: ['sent', 'queued']
    },
    (completed, cancelled, error) => {
      if (error) {
        console.log('短信发送出错:', error);
      } else if (cancelled) {
        // 用户点击取消按钮的回调逻辑
        console.log('用户取消发送');
      } else if (completed) {
        // 用户点击发送按钮的回调逻辑
        console.log('短信已发送');
      }
    }
  );
};

方案2:自行封装原生模块

如果不想引入第三方依赖,可自己封装React Native原生模块实现状态监听:

  • iOS端:调用系统MFMessageComposeViewController组件,实现MFMessageComposeViewControllerDelegate代理,在代理回调中获取用户操作结果,通过Promise或事件通知传递给JS层
  • Android端:通过带返回值的启动方式拉起短信应用,在onActivityResult(或新版Activity Result API)中获取返回状态,回调给JS层

补充说明

回调返回的「发送成功」仅代表用户点击了发送按钮、系统已将短信提交到发送队列,无法保证短信实际被运营商送达,需要确认送达状态的话需要配合后端的短信回执接口校验。

内容的提问来源于stack exchange,提问作者bgcodes

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 08:54:00