React-Native+AWS Amplify注册时无法接收SMS验证码求助
React Native + AWS Amplify 注册无SMS验证码接收问题排查方案
问题复盘
- 基于React Native开发的移动应用,后端采用AWS Amplify
- 用户注册流程需通过SMS验证码完成账户验证,但实际无法接收验证码
- 控制台日志显示“消息已发送”,无错误弹窗提示
- 用户信息已成功存入Amplify用户池,但账户处于未验证状态
- 已启用MFA,注册验证方式设为SMS
- 注:用户模型中
NICKNAME字段被用于存储IBAN等额外个人信息
逐点排查与修复方案
1. 核查AWS SNS基础配置
- 手机号格式校验:Amplify要求手机号严格遵循E.164标准(如
+8613xxxxxxxxx),不能包含空格、括号或省略国际区号,注册时传入的phone_number字段必须完全符合该格式,否则SNS会静默发送失败。 - 查看SNS发送记录:登录AWS控制台进入SNS服务,查看短信发送历史,确认是否存在
MessageRejected、InvalidPhoneNumber等失败状态码,这里可直接获取发送失败的具体原因。 - 账户短信额度与权限:AWS新账户有短信发送额度限制,超出后会被拦截;部分国家/地区的短信发送需额外申请权限,需确认目标手机号所在地区是否在AWS SNS支持列表内。
2. 核对Amplify Auth配置
- 检查aws-exports.js配置:确认auth模块的关键配置项正确:
// aws-exports.js 中auth相关配置片段 auth: { // ...其他配置 signInVerificationMethod: "sms", mfaConfiguration: "OPTIONAL", // 或根据需求设为REQUIRED mandatorySignIn: true, } - 用户池验证规则:进入Cognito用户池,检查「MFA和验证」设置,确认「注册验证」渠道选择为SMS,且已关联正确的SNS服务角色。
3. 前端代码逻辑校验
- 注册方法调用正确性:确保
Auth.signUp参数完整且格式合规,重点核对phone_number字段:// 正确的signUp调用示例 try { const result = await Auth.signUp({ username: userPhone, // 建议直接用符合格式的手机号作为username password: userPassword, attributes: { phone_number: formattedPhone, // 必须为E.164格式的手机号 nickname: userIBAN // 自定义存储IBAN的字段 } }); console.log('注册请求发送成功:', result); } catch (err) { console.error('注册错误:', err); // 务必捕获所有错误,避免静默失败 } - 应用权限配置:Android端需在
AndroidManifest.xml添加短信相关权限:
iOS端需在<uses-permission android:name="android.permission.SEND_SMS" /> <uses-permission android:name="android.permission.RECEIVE_SMS" />Info.plist中添加权限描述:<key>NSMessagesUsageDescription</key> <string>需要获取短信权限以接收验证代码</string>
4. 其他潜在问题排查
- AWS区域一致性:确认Amplify初始化的区域与SNS服务使用的区域一致,部分区域不支持国际短信发送。
- 运营商拦截:部分运营商会拦截境外发来的短信,可更换测试手机号或联系运营商确认是否存在拦截规则。
内容的提问来源于stack exchange,提问作者Adam Dalton
相关产品推荐
相关产品推荐

