Firebase iOS端手机号认证在沙特阿拉伯地区无法发送验证短信
Firebase iOS 手机号认证沙特地区无法下发验证短信排查方案
你当前的核心调用逻辑符合Firebase Phone Auth的基础实现要求,对应loginVC的实现代码如下:
PhoneAuthProvider.provider().verifyPhoneNumber(phoneNumberWithCode, uiDelegate: nil) { [unowned self] verificationID, error in if let error = error { IndicatorManager.indicatorShared.stopIndecator() Crashlytics.crashlytics().record(error: error) print(error.localizedDescription) print(error) return } IndicatorManager.indicatorShared.stopIndecator() UserDefaults.standard.set(verificationID, forKey: "authVerificationID") UserDefaults.standard.set(phoneNumberWithCode, forKey: "userPhoneNumber") self.errorMessageLbl.text = "" let vc = SharedViewControllers().verificationCodeVC vc.phoneNumber = phoneNumberWithCode vc.phoneNumberWithoutCode = phoneNumber UserDefaultsConfig.phoneNumberWithoutCode = phoneNumber var codeNum = codeNuber.text! if let pluse = codeNum.firstIndex(of: "+") { codeNum.remove(at: pluse) } UserDefaultsConfig.countryCode = codeNum vc.countryCode = codeNuber.text! self.navigationController?.pushViewController(vc, animated: true) } }
按以下优先级逐一排查即可定位问题:
- 区域权限与计费配置核查
- Firebase手机号认证对未绑定付费方式的免费项目,默认仅开放北美、西欧等主流区域的短信下发权限,沙特(国家码+966)属于需要手动开通的区域,需进入Firebase控制台「Authentication-登录方式-手机号」页面,确认已勾选沙特地区的发送权限,且项目已绑定有效付费方式,否则所有发往沙特的请求会被静默拦截,不会返回明确错误。
- 核查项目短信配额:免费配额默认单号码每小时最多发送5条、单日最多发送10条,若沙特区域用户集中触发验证极易触发限流,限流后同样不会返回错误提示。
- 号码格式校验
传入verifyPhoneNumber方法的号码必须严格符合E.164格式规范:- 格式为
+[国家码][去掉本地前缀0的手机号],例如沙特本地号码0512345678对应的正确格式是+966512345678,号码中不能包含空格、短横线等特殊字符,也不能保留本地号码开头的0。 - 沙特本地虚拟运营商号段、物联网卡号段(多为057、058开头)不在Firebase支持的下发范围内,会被运营商侧直接拦截。
- 格式为
- 客户端配置核查
- 你当前代码中使用
[unowned self]持有控制器,若回调触发时登录页已被销毁会直接触发野指针崩溃,建议替换为[weak self]并在回调内部做安全解包。 - 现有错误打印仅输出了
localizedDescription,无法拿到Firebase返回的具体错误码,需补充打印错误的userInfo字段和错误码:沙特区域网络环境下reCAPTCHA验证加载失败、APNs推送证书未正确配置导致应用真实性校验不通过,是非常常见的失败原因,这类错误不会提示地域限制,只会返回通用的验证失败错误码。 - 确认项目已正确配置Firebase Auth的APNs推送能力:未上传正确APNs证书/密钥的应用,在中东区域会强制触发reCAPTCHA验证,而沙特本地运营商网络经常屏蔽Google相关域名,导致reCAPTCHA加载失败进而中断短信下发流程。
- 你当前代码中使用
- 运营商拦截适配
沙特本地STC、Mobily、Zain三大运营商默认会拦截境外公共短信号码段下发的短信,如果以上配置都确认无误,可在Firebase控制台申请沙特本地专属发送短码,或开启语音验证码 fallback 通道,给短信下发失败的用户自动触发语音验证。
注意:不要在测试阶段直接使用沙特本地真实号码批量测试,极易触发Firebase的反作弊风控,导致对应号段的下发请求被临时封禁。
内容的提问来源于stack exchange,提问作者Froodo
相关产品推荐
相关产品推荐

