Alamofire is a popular framework for iOS and Mac projects. Here is how to use Alamofire to implement token signing and retry network requests after refreshing tokens after expiration.

  • Create a RequestAdapter and a RequestRetrier

    final class RequestInterceptor: Alamofire.RequestInterceptor {

    func adapt(_ urlRequest: URLRequest, for session: Session, completion: @escaping (Result<URLRequest, Error>) -> Void) { guard urlRequest.url? . AbsoluteString. HasPrefix (BaseURL) = = true else {/ / / if the request does not need to signature the directly to request the return completion (. Success (urlRequest)} var UrlRequest = urlRequest /// Use the access token to sign urlRequest.setValue(your cached token, forHTTPHeaderField: "Authorization") urlRequest.setValue(" Add some key-value pairs here for the device information that the server needs to collect ", forHTTPHeaderField: "User-Agent") urlRequest.setValue("application/json", forHTTPHeaderField: "Content-Type") completion(.success(urlRequest)) } func retry(_ request: Request, for session: Session, dueTo error: Error, completion: @escaping (RetryResult) -> Void) { guard let response = request.task? .response as? HTTPURLResponse, response.statusCode == 401 else { Return completion(.donotretryWitherror (error))} /// 401Token expires, Call the refresh request method HpptClient. Share. RefreshToken {(complete) in the if complete {/ / / refresh token success after 1 second retry the request Completion (.retryWithDelay(1))} else {/// Return completion(.donotretrywitherror (error))}}}Copy the code

    }

  • Create a custom Session

    class SessionManager: NSObject { static let share: SessionManager = SessionManager()

    var sessionManager: Session! fileprivate let configuration = URLSessionConfiguration.default override init() { super.init() configSession() } final Func configSession () {configuration. TimeoutIntervalForRequest = 15 / / 15 s timeout our sessionManager = Session (configuration: configuration, interceptor: RequestInterceptor()) }Copy the code

    }

  • Use the configured Session to make network requests

    LDSessionManager. Share. Our sessionManager. Request (request address, method: method type, parameters, request parameters, encoding: JSONEncoding.default) .validate(statusCode: 200.. <300) .validate(contentType: [“application/json”]) .responseData { response in switch response.result { case let .success(value): let dataJson = JSON(value) printD(“response = (dataJson)”) case let .failure(error): printD(error) } }

References:

www.avanderlee.com/swift/authe…