iOS Firebase短信验证reCAPTCHA流程后verifyPhoneNumber卡在空白页
问题概述
基于firebase-ios-sdk v11.2的quickstart-ios实现手机号认证,模拟器环境已禁用Swizzling,尝试走reCAPTCHA作为APNs的 fallback方案,但调用PhoneAuthProvider.provider().verifyPhoneNumber后,页面卡在about:blank。已完成GoogleService-Info.plist配置、添加REVERSED_CLIENT_ID的URL Scheme、实现了canHandle、openURLContexts等代理方法。
核心修复点
1. 关联SceneDelegate到场景配置
AppDelegate中注释了SceneDelegate的关联代码,导致reCAPTCHA验证完成后的URL回调无法触发,页面无法关闭。修改configurationForConnecting方法:
func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration { let sceneConfig = UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role) sceneConfig.delegateClass = SceneDelegate.self // 启用这行代码 return sceneConfig }
2. 修正URL回调的处理逻辑
SceneDelegate中仅调用Auth.auth().canHandle(url)不足以完成reCAPTCHA的回调闭环,需要调用handle(url)让Firebase处理并关闭验证页面:
func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) { guard let url = URLContexts.first?.url else { return } if Auth.auth().canHandle(url) { _ = Auth.auth().handle(url) // 替换原canHandle调用 } }
3. 提供正确的UI代理给verifyPhoneNumber
调用verifyPhoneNumber时传入uiDelegate: nil会导致reCAPTCHA页面无法正确处理生命周期,需要传入当前的UIViewController作为代理:
在ContentView中添加获取根视图控制器的方法:
private func getCurrentViewController() -> UIViewController? { guard let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene, let window = windowScene.windows.first else { return nil } return window.rootViewController }
然后修改verifyPhoneNumber调用:
PhoneAuthProvider.provider().verifyPhoneNumber(countryCodeNumber + phoneNumber, uiDelegate: getCurrentViewController() as? any FUIAuthDelegate) { verificationID, error in // 原有逻辑保持不变 }
4. 修正代码拼写错误
FirebaseError.VerificatrionEmpty存在拼写错误,修正为FirebaseError.VerificationEmpty(不影响卡页,但避免后续逻辑问题)。
5. 确保模拟器走reCAPTCHA流程
模拟器无法获取APNs令牌,Firebase会自动fallback到reCAPTCHA,无需额外设置;若需强制测试reCAPTCHA,可在Firebase初始化后添加:
Auth.auth().settings?.isAppVerificationDisabledForTesting = true
验证
完成上述修改后,重新编译运行模拟器:
- 输入手机号点击Submit,reCAPTCHA页面正常加载
- 完成验证后页面自动关闭,返回verificationID
- 输入验证码即可完成登录
内容的提问来源于stack exchange,提问作者Nick Carducci for Carface Bank

