【问题标题】:Not getting Firebase token id when calling getIdToken in Swift 5 iOS在 Swift 5 iOS 中调用 getIdToken 时未获取 Firebase 令牌 ID
【发布时间】:2021-02-07 19:36:59
【问题描述】:

我已经尝试了 3 天来完成这项工作,但我看不到我要去哪里。当尝试使用 firebase 提供的 - (void)getIDTokenWithCompletion: (nullable void (^)(NSString *_Nullable __strong, NSError *_Nullable __strong))completion; 函数获取 firebase tokenId 时,我没有得到任何回报。

我创建了一个单独的类来使用完成处理程序获取 Id。下面是我正在使用的代码

import Foundation
import FirebaseAuth

class FirebaseToken  {
    static var shared = FirebaseToken.init()
    func getIdToken(token completion: @escaping(String?,Error?) -> Void){
        Auth.auth().currentUser?.getIDToken(completion:{ idToken, error in
            guard let error = error else {return }
            print(error)
            completion(nil, error)
            guard let token = idToken else {return}
            completion(token, nil)
            print(token)
        })

    }
}

这是我用来调用func getIdToken 函数以获取ID 的类,它位于func makeAPICall<T:Codable>(urlPath: String, apiMethod: HTTPMethod, expectedReturnType: T.Type,user completionHandler: @escaping ([T]?,Error?) 函数内部。

import Foundation
import Alamofire
import Firebase

class ApiService {
    
    static var shared = ApiService.init()
    
    let session: Session = {
        let manager = ServerTrustManager(allHostsMustBeEvaluated: false,evaluators: ["localhost": DisabledTrustEvaluator()])
        let configuration = URLSessionConfiguration.af.default
        
        return Session(configuration: configuration, serverTrustManager: manager)
    }()

    //MARK:- GET
    func makeAPICall<T:Codable>(urlPath: String, apiMethod: HTTPMethod, expectedReturnType: T.Type,user completionHandler: @escaping ([T]?,Error?) -> Void) {
        var urlComponent = URLComponents()
        urlComponent.scheme = "https"
        urlComponent.host = "localhost"
        urlComponent.port = 5001
        urlComponent.path = "/api/" + urlPath
        print(urlComponent.url!)
        guard let url = urlComponent.url else {
            return
        }
        
        var headers: HTTPHeaders?
        FirebaseToken.shared.getIdToken(token: {tokenId, error in
            guard let errors = error else {return}
            print(errors)
            guard let tokens = tokenId else {return}
            headers = [
                .authorization(bearerToken: tokens),
                .accept("application/json")
            ]
        })
        
        guard let headerAuth = headers else {
            print("not getting firebase token")
            return
        }
        print(headerAuth)
        session.request(url, method: apiMethod).validate().responseDecodable(of: [T].self) {(response) in
            switch response.result{
            case .success:
                guard let users = response.value else {
                    return
                }
                //print(header)
                completionHandler(users, nil)
            case .failure(let error):
                completionHandler(nil, error)
            }
        }
    }
}

函数内部的变量var headers: HTTPHeaders?

guard let headerAuth = headers else {
        print("not getting firebase token")
        return
    }

应该打印出令牌,由于某种原因,令牌没有被添加。有人可以让我知道我哪里出了问题,因为我被困了 3 天,而且我对 firebase 还是很陌生?

打印结果应该在print(headerAuth)以内,但是;我不断在print("not getting firebase token") 内获得结果

【问题讨论】:

    标签: swift firebase firebase-authentication


    【解决方案1】:

    getIdToken 方法是一个异步调用。任何需要生成令牌的代码都需要在完成处理程序中。

    比如:

    FirebaseToken.shared.getIdToken(token: {tokenId, error in
        guard let tokens = tokenId else {return}
        headers = [
            .authorization(bearerToken: tokens),
            .accept("application/json")
        ]
        guard let headerAuth = headers else {
            print("not getting firebase token")
            return
        }
    
        session.request(url, method: apiMethod).validate().responseDecodable(of: [T].self) {(response) in
            switch response.result{
            case .success:
                guard let users = response.value else {
                    return
                }
                completionHandler(users, nil)
            case .failure(let error):
                completionHandler(nil, error)
            }
        }
    
    })
    
        
    

    我也删除了这一行:

    guard let errors = error else {return}
    

    我很确定当出现 no 错误时,它会返回块外。

    【讨论】:

    • 我已经像这样更改了代码,但似乎异步调用没有运行,你能帮我知道如何解决这个问题吗?谢谢。
    猜你喜欢
    • 2018-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-24
    • 1970-01-01
    • 2021-09-07
    • 2014-11-10
    相关资源
    最近更新 更多