iOS

iOS) Alamofire 4 -> Alamofire 5 Migration

kangwook 2024. 4. 2. 11:27

이번에 Pod들의 전체적인 업데이트를 하면서 Alamofire의 메이저버전을 올리게 되었다.

그러면서 자연스럽게 오류가 생기고 이에 따른 문제를 해결하는 과정을 기록해보려고 한다.


첫 번째로, 기존의 Session Manager의 변경 부분이다.

Network Request를 하기 위한 NetworkManager가 존재하는데, 코드는 다음과 같이 구성되어 있었다. (Alamofire 4)

class NetworkManager {
    static let sharedInstance = NetworkManager()
    
    let manager: Alamofire.SessionManager = {
        let serverTrustPolicies: [String: ServerTrustPolicy] = [
            liveDomainURL: .pinCertificates(
                certificates: ServerTrustPolicy.certificates(),
                validateCertificateChain: true,
                validateHost: true),
            developDomainURL: .disableEvaluation
        ]
        
        let configuration = URLSessionConfiguration.default
        configuration.httpAdditionalHeaders = Alamofire.SessionManager.defaultHTTPHeaders
        
        
        return Alamofire.SessionManager(
            configuration: configuration,
            serverTrustPolicyManager: ServerTrustPolicyManager(policies: serverTrustPolicies)
        )
    }()
    
}

 

하지만 Alamofire 5 부터는 기존의 SessionManager가 Session으로 변경되는 등 많은 변화가 있었기 때문에, 업데이트를 할 경우 여러 부분을 수정해주어야 했다.

class NetworkManager {
    
    static let shared = NetworkManager()
    
    let session: Session = {
        let serverTrustManager = ServerTrustManager(
            allHostsMustBeEvaluated: false,
            evaluators: [
                liveDomainURL: PinnedCertificatesTrustEvaluator(),
                developDomainURL: DisabledTrustEvaluator()
            ])
        
        let configuration = URLSessionConfiguration.default
        configuration.headers = .default
        
        return Session(configuration: configuration, serverTrustManager: serverTrustManager)
    }()
    
}

1. 먼저 SessionManager를 Session으로 변경했다.

2. 또한, ServerTrustPolicy가 없어지고 ServerTrustManager가 새로 생겼는데, 이에 맞춰서 serverTrustManager를 구성해 Session에 넣어주어야 한다. allHostsMustBeEvaluated를 false로 설정하면 SSL 인증서가 없는 호스트에 대한 요청도 처리하려고 할 때 유용해진다.(좀 더 유연하게 처리 가능)

3. liveDomainURL: PinnedCertificatesTrustEvaluaotr() 같은 경우, 수동적으로 SSL 인증서를 설정할 수도 있지만, 기본 initialize를 하게 되면 해당 도메인의 인증서를 자동적으로 검사하여 요청을 처리할 수 있게한다.

4. 마지막으로 설정한 ServerTurstManager를 Session에 넣어 return해주면 기존의 manager가 했던 역할을 session이 할 수 있게된다.


그런데 여기서 되게 신기한 문제가 하나 발생했는데, 이를 공유하고자 한다.

기존의 liveDomainURL이나 developDomainURL은 "https://"를 포함하지 않은 상태였었다.

즉, 예를 들어 live-service.com, develop-service.com 이었는데, Alamofire 4의 ServerTrustPolicy.certificate()를 통해 인증서를 확인하는 과정에서 아무런 문제가 없었다.

그러나 Alamofire 5로 migration하면서, 자꾸 no certificates found 오류가 뜨는 것이었다. 그래서 여기저기 찾아보다가 삽질도 했는데, 결국 domain url에 https://를 붙여주면 되는 걸 찾아내고... 얼마나 허탈했는지 모른다,,,

아무튼, https://live-service.com으로 변경해주고나니 잘 실행되는 걸 볼 수 있었고, 이로써 성공적으로 Alamofire Migration을 완료했다. (DisabledTrustEvaluator()에 대응하는 developDomainURL에 대해서는 수정할 필요가 없다. 왜냐면 어차피 인증서 검증을 안하는 부분이기 때문에!)

 

(이 Session을 사용하는 여러 request들의 코드 또한 수정했으나, 해당 수정 부분은 response를 받는 completion을 간단히 고쳐주기만 하면 되어서 생략하겠다. )

 

궁금한점이나 틀린 내용이 있으면 댓글로 알려주세요!