Firebase Phone Auth中verifyPhoneNumber完成处理程序未执行
问题背景
我按照Firebase官方的iOS手机号验证指南实现功能,已确认Firebase及FirebaseAuth的前置配置步骤都正确完成。
预期行为
调用verifyPhoneNumber后,完成处理程序应正常执行,打印Inside the verifyPhoneNumber completion handler.,并输出以下三种情况之一:
- 若有错误:打印
Got an error trying to verify the phone number.及错误描述 - 验证成功:输出Verification ID
- 无错误但Verification ID为空:打印
Verification ID is nil, but no error was reported
实际行为
所有打印语句都未执行,推测完成处理程序根本没有被触发。调用该方法前的代码运行正常,应用可正常构建,模拟器和真机测试结果一致。
相关代码
PhoneAuthProvider.provider().verifyPhoneNumber( formattedPhoneNumber, uiDelegate: nil) { (verificationID, error) in print("Inside the verifyPhoneNumber completion handler.") if let error = error { print("Got an error trying to verify the phone number.") print(error.localizedDescription) return } if let verificationID = verificationID { print("Verification ID is \(verificationID)") } else { print("Verification ID is nil, but no error was reported.") } }
排查及解决方向
1. 确认Firebase初始化完成
确保在调用verifyPhoneNumber前,Firebase已完成初始化。可在AppDelegate的didFinishLaunchingWithOptions中添加验证:
FirebaseApp.configure() print("Firebase initialized successfully")
未完成初始化会导致异步回调永远无法触发。
2. 检查手机号格式
formattedPhoneNumber必须符合E.164标准格式(例如+1234567890),格式错误可能导致服务端无响应,进而不触发回调。可手动指定正确格式测试。
3. 验证Phone Auth启用状态
登录Firebase控制台,确认当前项目的Authentication > Sign-in method中,Phone选项已启用,且无错误的白名单/黑名单配置。
4. 检查网络连接
真机测试需确保设备网络稳定,模拟器需确认可正常访问外网(Firebase服务依赖网络请求)。
5. 查看底层日志
打开Xcode控制台,过滤FirebaseAuth相关日志,可能会发现服务端返回的未在回调中暴露的错误(如API密钥权限问题、项目配置不匹配)。
6. 确认依赖版本兼容性
检查Podfile中Firebase相关依赖版本,确保Firebase与FirebaseAuth版本一致,避免版本不兼容导致的回调异常。可执行pod update Firebase/Auth更新至最新稳定版测试:
pod 'Firebase/Auth'
7. 校验App ID与配置匹配
确认GoogleService-Info.plist中的BUNDLE_ID与项目的Bundle Identifier完全一致,配置文件不匹配会导致Auth服务无法正常工作。
内容的提问来源于stack exchange,提问作者Jon T

