在Swift 5 iOS中调用getIdToken时未获得Firebase令牌id



我已经尝试了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")

内获得结果

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}

因为我很确定当没有时,它会从块中返回错误。

最新更新