나의 플랫폼/iOS

[iOS][Alamofire] NSURLSession/NSURLConnection HTTP load failed

GsBOB 2017. 6. 15. 16:37
Https 도메인을 연결하기 위해선 SSL 인증이 필요하다.
이를 제대로 설정 하지 않으면 아래 와 같은 이슈를 보게 되는데요.

NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9843

참고로 -9843 에러가 어떤 에러 인지 알고 싶으신 분들은 아래 사이트 들어가보시면 됩니다.
에러 번호 별로 설명이 되어 있습니다.


위 에러가 발생하면 맨 처음 plist에서 설정을 변경 합니다.
아래 내용을 참고 하시면 되겠습니다.


2개의 방법이 있는데, 

전체의 HTTP를 허용하는 방법과 도메인마다 설정해서 허용하는 방법이 있습니다.


1. 전체의 HTTP를 허용하는 방법(비추천이라고 합니다)

<key> NSAppTransportSecurity </ key> <dict> <key> NSAllowsArbitraryLoads </ key> <true /> </ dict>





2. ATS를 제외시킬 도메인을 Info.plist에 기재하는 방법


<key> NSAppTransportSecurity </ key> <dict> <key> NSExceptionDomains </ key> <dict> <key> www.xxx.com </ key> <dict> <key> NSTemporaryExceptionAllowsInsecureHTTPLoads </ key> <true /> </ dict> </ dict> </ dict>






만약!!!
저렇게 설정 했는데도 되지 않으신 분들은 아래와 같이 수정해 보세요.
참고로 이 수정 부분은 Alamofire Library를 사용 하시는 분만 참고 하시면 되겠습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
private static var Manager: Alamofire.SessionManager = {
        let serverTrustPolicies: [String: ServerTrustPolicy] = [
            "제외 시키고자 하는 URL": .disableEvaluation
        ]
        
        let manager = Alamofire.SessionManager(
            configuration: URLSessionConfiguration.default,
            delegate: SessionDelegate(),
            serverTrustPolicyManager: ServerTrustPolicyManager(policies: serverTrustPolicies)
        )
        
        return manager
    }()
 
    request = Manager.request(URL)
       .responseJSON { response in
                
 
    }
cs


위 소스에서 Manager.request가 원래 Alamofire.request 였을 겁니다.
위와 같이 제외 시키고자 하는 URL을 넣으시고,
Manager 로써 request를 호출 하면 해당 URL은 SSL인증에서 제외 됩니다.

참고하세요.

참고로 Alamofire 는 4.4버전 입니다.