【问题标题】:"The phone auth credential was created with an empty verification ID" - Firebase SwiftUI\“电话授权凭据是使用空验证 ID 创建的\”- Firebase SwiftUI
【发布时间】:2023-01-05 02:07:50
【问题描述】:

我用firebase做了电话认证,但是当我输入验证码时,我得到一个错误 “电话身份验证凭据是使用空验证 ID 创建的”

屏幕: enter image description here

代码:

import SwiftUI
import Firebase

class OTPViewModel: ObservableObject {
    
    @Published var number: String = ""
    @Published var code: String = ""
    
    @Published var otpText: String = ""
    @Published var otpFields: [String] = Array(repeating: "", count: 6)
    
    @Published var showAlert: Bool = false
    @Published var errorMsg: String = ""
    @Published var verificationCode: String = ""
    @Published var isLoading: Bool = false
    @Published var navigationTag: String?
    
    @AppStorage("log_status") var log_status = false
    
    func sendOTP()async{
        if isLoading{return}
        do{
            isLoading = true
            let result = try await
            PhoneAuthProvider.provider().verifyPhoneNumber("+\(code)\(number)", uiDelegate: nil)
            DispatchQueue.main.async {
                self.isLoading = false
                self.verificationCode = result
                self.navigationTag = "VERIFICATION"
            }
        }
        catch{
            handleError(error: error.localizedDescription)
        }
    }
    
    func handleError(error: String){
        DispatchQueue.main.async {
            self.isLoading = false
            self.errorMsg = error
            self.showAlert.toggle()
        }
    }
    
    func verifyOTP()async{
        do{
            isLoading = true
            let credential = PhoneAuthProvider.provider().credential(withVerificationID: verificationCode, verificationCode: otpText)
            let _ = try await Auth.auth().signIn(with: credential)
            DispatchQueue.main.async {[self] in
                isLoading = false
                log_status = true
            }
        }
        catch{
            handleError(error: error.localizedDescription)
        }
    }
}

我尝试在 verifyOtp 方法的 isLoading = true 之前添加这个。

otpText = otpFields.reduce("") { partialResult, value in
   partialResult + value
}

但仍然没有奏效

【问题讨论】:

  • 您提供给PhoneAuthProvider.provider().credential(withVerificationID, verificationCode) 的verificationCode 似乎是空的。你确认不是这样了吗?
  • 我对我应该做什么感到有点困惑
  • 在您致电PhoneAuthProvider.provider().credential之前放置一个print(verificationCode)

标签: ios swift swiftui firebase-authentication


【解决方案1】:

有同样的问题,这是解决方案:

  1. 在你的sendOTP()函数中,在self.verificationCode = result之后添加UserDefaults.standard.set(self.verificationCode, forKey: "authVerificationID")
  2. 在你的verifyOTP()函数中,在isLoading = true之后添加let verificationCode = UserDefaults.standard.string(forKey: "authVerificationID") ?? ""

    关键是您需要保存您的验证 ID,然后检索它以确保如果您的应用程序在用户完成登录流程之前终止,它仍然有效。请参阅文档here 的第 3.3 条。

【讨论】:

    猜你喜欢
    • 2022-06-24
    • 1970-01-01
    • 2020-02-16
    • 1970-01-01
    • 1970-01-01
    • 2020-06-26
    • 2018-08-20
    • 2021-03-01
    • 2019-06-27
    相关资源
    最近更新 更多