Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何使用Alamofire';s RequestAdapter是否将firebase ID令牌设置为全局标头?_Ios_Swift_Alamofire - Fatal编程技术网

Ios 如何使用Alamofire';s RequestAdapter是否将firebase ID令牌设置为全局标头?

Ios 如何使用Alamofire';s RequestAdapter是否将firebase ID令牌设置为全局标头?,ios,swift,alamofire,Ios,Swift,Alamofire,在我使用firebase对用户进行身份验证之后,我将获得ID令牌,因为我的REST服务正在使用firebase令牌进行身份验证 在ios端,我想存储这个令牌,这样我发出的每个请求都将使用令牌设置授权头 Alamofire文档建议使用RequestAdapter 所以我做了一个令牌拦截器: import Foundation import Alamofire final class TokenInterceptor: Alamofire.RequestInterceptor { priv

在我使用firebase对用户进行身份验证之后,我将获得ID令牌,因为我的REST服务正在使用firebase令牌进行身份验证

在ios端,我想存储这个令牌,这样我发出的每个请求都将使用令牌设置授权头

Alamofire文档建议使用RequestAdapter

所以我做了一个令牌拦截器:

import Foundation
import Alamofire

final class TokenInterceptor: Alamofire.RequestInterceptor {
    private var token: String
    
    init(token: String) {
        self.token = token
    }
    
    func adapt(_ urlRequest: URLRequest, for session: Session, completion: @escaping (Result<URLRequest, Error>) -> Void) {
        var urlRequest = urlRequest

        urlRequest.setValue("Bearer " + self.token, forHTTPHeaderField: "Authorization")

        completion(.success(urlRequest))
    }
}

您可以在每个会话或每个请求的基础上使用
RequestAdapter
<代码>会话的初始值设定项可以获取该值,然后用于所有请求:

let session=session(拦截器:拦截器(适配器:YourAdapter()))
或者,您可以根据请求进行设置:

AF.request(…,拦截器:拦截器(适配器:YourAdapter())。响应。。。

您可以在我们的或中阅读更多内容。

谢谢Jon。我遵照您的建议,在上面的AuthenticationState类中将此自定义会话设置为私有变量。然后我添加了一个
authenticatedRequest()
我可以向其传递URL可转换参数,它将使用专用会话。由于我将其用作环境对象,因此我的任何视图都可以使用authenticatedRequest。这就是您所说的建议使用此自定义会话的意思吗?谢谢,我仍在学习,因此如果我说任何术语都是错误的。我不建议对未经身份验证的调用和经过身份验证的调用使用单独的
会话
s。相反,您可以使用per-
请求
API仅将适配器附加到需要进行身份验证的请求。这里有很多方法,包括方便的方法,或者使用我们的
URLRequestConvertible
协议为请求构建所有内容。谢谢!这很有意义
import Foundation
import FirebaseAuth
import Alamofire

class AuthenticationState: NSObject, ObservableObject {
    @Published var user: User?
    @Published var error: NSError?
    @Published var loading: Bool = true
    
    private let auth = Auth.auth()
    
    private var fbUser: FirebaseAuth.User?
    
    func signInWithEmailPassword(email: String, password: String) {
        self.auth.signIn(withEmail: email, password: password, completion: handleAuthResultCompletion)
    }
    
    private func handleAuthResultCompletion(auth: AuthDataResult?, error: Error?) {
        DispatchQueue.main.async {
            self.loading = false
            if let fbUser = auth?.user {
                self.fbUser = fbUser
                fbUser.getIDTokenForcingRefresh(true) { idToken, error in
                  if let error = error {
                    // Handle error
                  }
                
                    // What am I to do here?  How does this affect AF namespace? 
                    Session(interceptor: RequestInterceptor(token: idToken ?? ""))
                    
                    self.me()
                }
            } else if let error = error {
                self.error = error as NSError
            }
        }
    }
    
    private func me() {
        AF.request("http://localhost:8080/api/v1/me").response { response in
            print(response)
        }
    }
}