Swift中Firebase的.verifyPhoneNumber函数未调用问题求助
Firebase电话认证verifyPhoneNumber无回调问题
已完成的配置步骤
- 为Firebase项目启用电话号码登录功能
- 在Xcode中为应用开启推送通知
- 创建APN密钥并上传至Firebase(填写团队ID和密钥ID)
- 在Xcode中配置reCAPTCHA
- 安装firebase-ios-sdk
实现代码
号码校验方法
import Firebase import FirebaseAuth import FirebaseCore func checkPhoneNumber(phoneNumber: String, completion: @escaping VerificationCompletion) { let phoneAuth = PhoneAuthProvider.provider() print(phoneAuth) print(phoneNumber) FirebaseConfiguration.shared.setLoggerLevel(.debug) phoneAuth.verifyPhoneNumber("+1"+phoneNumber, uiDelegate: nil) { verificationID, error in if let verificationID = verificationID { print(verificationID) } if let error = error { print(error.localizedDescription) completion(false, .failure(error)) return } // 存储验证ID供后续使用 UserDefaults.standard.set(verificationID, forKey: "verificationID") completion(true,.success(verificationID ?? "")) } print("Function checkPhoneNumber run.") }
调用代码
Button(action: { let impactLight = UIImpactFeedbackGenerator(style: .light) impactLight.impactOccurred() checkPhoneNumber(phoneNumber: user.phoneNumber) { success, error in print(success, error) if success { DispatchQueue.main.async { router.push(.page3) } } else { print("error!") } } }, label: { continueButton() .padding() })
问题现象
每次点击按钮仅输出以下内容,verifyPhoneNumber的回调完全未触发:
<FIRPhoneAuthProvider: 0x600003db33e0> (453) 454-33 Function checkPhoneNumber run.
已尝试的解决措施
- 修改电话号码格式
- 将
verifyPhoneNumber直接写在按钮点击事件中调用 - 更新firebase-ios-sdk到最新版本
- 重新生成并上传APN密钥
- 在真机上运行测试
- 重新下载并导入google-info.plist
- 为模拟器开启后台模式
- 设置
Auth.auth().settings.isAppVerificationDisabledForTesting = true
以上操作均未解决问题,且无法获取任何错误信息。
解决方向
确认Firebase初始化时机
确保在调用PhoneAuthProvider.provider()前已完成Firebase初始化,比如在App.swift或SceneDelegate中优先执行FirebaseApp.configure(),且初始化代码要早于所有Firebase相关操作。严格校验电话号码格式
确保拼接后的号码符合E.164标准,清除所有非数字字符,比如:
let cleanedNumber = phoneNumber.replacingOccurrences(of: "[^0-9]", with: "", options: .regularExpression) phoneAuth.verifyPhoneNumber("+1" + cleanedNumber, uiDelegate: nil) { ... }
- 检查reCAPTCHA配置细节
- 确认
Info.plist中添加了GCC_PREPROCESSOR_DEFINITIONS,包含FIRAuth_ENABLE_RECAPTCHA=1 - 核对应用Bundle ID与Firebase项目中注册的完全一致
- 真机测试时确保设备能正常访问Google服务
- 重置Auth会话
在调用verifyPhoneNumber前,尝试清除现有Auth会话:
try? Auth.auth().signOut()
再执行号码验证流程,排查是否有未完成的会话阻塞回调。
查看Firebase后台日志
前往Firebase控制台的「认证」->「日志」页面,查看是否有控制台未输出的错误记录,获取更多调试细节。确认推送权限状态
确保应用已获取用户推送权限,可在启动时主动请求:
UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .badge, .sound]) { granted, error in if granted { DispatchQueue.main.async { UIApplication.shared.registerForRemoteNotifications() } } }
同时再次核对APN密钥的团队ID、密钥ID与Firebase后台配置完全匹配,且密钥未过期。
内容的提问来源于stack exchange,提问作者Mihajlo Kovacevic
相关产品推荐
相关产品推荐

