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
相关产品推荐
相关产品推荐

