You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

以上操作均未解决问题,且无法获取任何错误信息。


解决方向

  1. 确认Firebase初始化时机
    确保在调用PhoneAuthProvider.provider()前已完成Firebase初始化,比如在App.swift或SceneDelegate中优先执行FirebaseApp.configure(),且初始化代码要早于所有Firebase相关操作。

  2. 严格校验电话号码格式
    确保拼接后的号码符合E.164标准,清除所有非数字字符,比如:

let cleanedNumber = phoneNumber.replacingOccurrences(of: "[^0-9]", with: "", options: .regularExpression)
phoneAuth.verifyPhoneNumber("+1" + cleanedNumber, uiDelegate: nil) { ... }
  1. 检查reCAPTCHA配置细节
  • 确认Info.plist中添加了GCC_PREPROCESSOR_DEFINITIONS,包含FIRAuth_ENABLE_RECAPTCHA=1
  • 核对应用Bundle ID与Firebase项目中注册的完全一致
  • 真机测试时确保设备能正常访问Google服务
  1. 重置Auth会话
    在调用verifyPhoneNumber前,尝试清除现有Auth会话:
try? Auth.auth().signOut()

再执行号码验证流程,排查是否有未完成的会话阻塞回调。

  1. 查看Firebase后台日志
    前往Firebase控制台的「认证」->「日志」页面,查看是否有控制台未输出的错误记录,获取更多调试细节。

  2. 确认推送权限状态
    确保应用已获取用户推送权限,可在启动时主动请求:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 21:48:26