3

This is my session manager class

import UIKit
import Alamofire
import ObjectMapper
import AlamofireObjectMapper
import Reqres


class Manager: SessionManager {
    static let sharedInstance: Manager = Manager()
    static let manager: Manager = {
        let configuration = Reqres.defaultSessionConfiguration()
        let manager = Manager(configuration: configuration)

        return manager
    }()

    func getRequest(url:URL,param:Parameters,withSuccess success:@escaping (_ response: Dictionary<String, Any>) -> ()){
        guard Utils.isInternetAvailable() else{
            Utils.showAlert(message: "Internet connection lost", action: { 

            })
            return
        }
        Utils.addHUD()
        Alamofire.request(url, method: .get, parameters: param, encoding: URLEncoding.default).responseJSON { (response:
            DataResponse<Any>) in
            guard response.result.isSuccess else{
                 Utils.hideHUD()
                Utils.showAlert(message: (response.result.error?.localizedDescription)!, action: {

                })
                return
            }
            Utils.hideHUD()
            print(response.request!)  // original URL request
            print(response.response!) // HTTP URL response
            print(response.data!)     // server data
            print(response.result)   // result of response serialization
            success(response.result.value! as! Dictionary<String, Any>)
        }
    }
}

I have to make request to a server url which is an https request without valid ssl certificates.I have applied server policies to do so but still getting the error: "The certificate for this server is invalid"

other alternatives that i have tried

class Manager: SessionManager {
    static let manager: Manager = {
        let configuration = Reqres.defaultSessionConfiguration()
        let serverTrustPolicies: [String: ServerTrustPolicy] = ["192.168.1.28:8443": .DisableEvaluation]
        let manager = Manager(configuration: configuration, serverTrustPolicyManager: ServerTrustPolicyManager(policies: serverTrustPolicies))

        return manager
    }()
harshal jadhav
  • 5,456
  • 2
  • 18
  • 26

3 Answers3

5

Try this which seems to be working for me -

extension SessionManager {
static func getManager() -> SessionManager{

    let serverTrustPolicies: [String: ServerTrustPolicy] = [
        "192.168.1.28:8443": .disableEvaluation
    ]

    let configuration = Reqres.defaultSessionConfiguration()
    configuration.httpAdditionalHeaders = Alamofire.SessionManager.defaultHTTPHeaders

    return Alamofire.SessionManager(
        configuration: configuration,
        serverTrustPolicyManager: ServerTrustPolicyManager(policies: serverTrustPolicies)
    )
}

}

And to use this SessionManager do the following -

var manager: SessionManager?
manager = SessionManager.getManager()
manager?.request// Here is your request call.
Kapil G
  • 4,081
  • 2
  • 20
  • 32
  • where will be my get request method in this case please see my whole singleton class i edited my question to show whole class – harshal jadhav Jul 27 '17 at 09:44
  • I just created an extension to SessionManager class. So instead of using the default session managet you can use this one. The rest of your code will remain the same so you were currently doing. I am assuming your Manager Singleton is your custom class for network layer abstraction right? Then why have you extended it from SessionManager. Ideally shouldn't. – Kapil G Jul 27 '17 at 09:51
  • Also your request method can remain there as it is. All you have to do is instead of calling Alamofire.Request in that method call the code i gave manager?.request – Kapil G Jul 27 '17 at 09:52
  • ok @kapsym thanks for the help i will refactor my code also it will be helpfull if you share the any network class sample if you have – harshal jadhav Jul 27 '17 at 09:57
  • It would all depend on what Architecture you are following. is it MVVM, MVC, VIPER etc and how your project is structured so far. Look for some samples on the internet based on your app architecture – Kapil G Jul 27 '17 at 10:03
  • iam using MVC pattern can you just refactor my class according to your answer coz ai am still getting invalid cert error – harshal jadhav Jul 27 '17 at 10:06
  • Update your code to your modified code where you are still getting that error. I thought it worked for you already – Kapil G Jul 27 '17 at 10:09
0

In case if any one needs here is my network class..

import UIKit
import Alamofire
import Reqres

class Manager{
    static let sharedInstance: Manager = Manager()
    static let manager:SessionManager = {
        let configuration = Reqres.defaultSessionConfiguration()
        let manager = SessionManager()
        return manager
    }()

    // Call this function before each get/post request only if you have unsigned certificate for https request
    func setByPass() {
        let delegate: SessionDelegate = Manager.manager.delegate
        delegate.sessionDidReceiveChallenge = { session, challenge in
            var disposition: URLSession.AuthChallengeDisposition = .performDefaultHandling
            var credential: URLCredential?
            if challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust {
                disposition = URLSession.AuthChallengeDisposition.useCredential
                credential = URLCredential(trust: challenge.protectionSpace.serverTrust!)
            } else {
                if challenge.previousFailureCount > 0 {
                    disposition = .cancelAuthenticationChallenge
                } else {
                    credential = Manager.manager.session.configuration.urlCredentialStorage?.defaultCredential(for: challenge.protectionSpace)
                    if credential != nil {
                        disposition = .useCredential
                    }
                }
            }
            return (disposition, credential)
        }
    }

    func getRequest(url:URL,param:Parameters,withSuccess success:@escaping (_ response: Dictionary<String, Any>) -> ()){
        guard Utils.isInternetAvailable() else{
            Utils.showAlert(message: "Internet connection lost", action: { 

            })
            return
        }
        self.setByPass()
        Utils.addHUD()
        Manager.manager.request(url, method: .get, parameters: param, encoding: URLEncoding.default).responseJSON { (response:
            DataResponse<Any>) in
            guard response.result.isSuccess else{
                 Utils.hideHUD()
                Utils.showAlert(message: (response.result.error?.localizedDescription)!, action: {

                })
                return
            }
            Utils.hideHUD()
            print(response.request!)  // original URL request
            print(response.response!) // HTTP URL response
            print(response.data!)     // server data
            print(response.result)   // result of response serialization
            success(response.result.value! as! Dictionary<String, Any>)
        }
    }

    func getRequestWithoutParam(url:URL,withSuccess success:@escaping (_ response: Dictionary<String, Any>) -> ()){
        guard Utils.isInternetAvailable() else{
            Utils.showAlert(message: "Internet connection lost", action: {

            })
            return
        }
    self.setByPass()
    Utils.addHUD()
    let headers = ["Content-Type":"Application/json"]
    Manager.manager.request(url, encoding:JSONEncoding.default, headers: headers).responseJSON { (response:
    DataResponse<Any>) in
    guard response.result.isSuccess else{
        Utils.hideHUD()
    Utils.showAlert(message: (response.result.error?.localizedDescription)!, action: {

    })
    return
    }
        Utils.hideHUD()
    print(response.request!)  // original URL request
    print(response.response!) // HTTP URL response
    print(response.data!)     // server data
    print(response.result)   // result of response serialization
    success(response.result.value! as! Dictionary<String, Any>)
    }
    }



    func postRequest(url:URL,param:Parameters,withSuccess success:@escaping (_ response: Dictionary<String, Any>) -> ()){
        guard Utils.isInternetAvailable() else{
            Utils.showAlert(message: "Internet connection lost", action: {

            })
            return
        }
        self.setByPass()
        Utils.addHUD()
        let headers = ["Content-Type":"Application/json"]
        Manager.manager.request(url, method: .post,  parameters: param, encoding:JSONEncoding.default, headers: headers).responseJSON { (response:
            DataResponse<Any>) in
            guard response.result.isSuccess else{
                Utils.hideHUD()
            Utils.showAlert(message: (response.result.error?.localizedDescription)!, action: {

            })
            return
        }
            Utils.hideHUD()
            print(response.request!)  // original URL request
            print(response.response!) // HTTP URL response
            print(response.data!)     // server data
            print(response.result)   // result of response serialization
            success(response.result.value! as! Dictionary<String, Any>)
        }
    }

    func putRequest(url:URL,param:Parameters,withSuccess success:@escaping (_ response: Dictionary<String, Any>) -> ()){
        guard Utils.isInternetAvailable() else{
            Utils.showAlert(message: "Internet connection lost", action: {

            })
            return
        }
        self.setByPass()
        Utils.addHUD()
        let headers = ["Content-Type":"Application/json"]
        Manager.manager.request(url, method: .put,  parameters: param, encoding:JSONEncoding.default, headers: headers).responseJSON { (response:
            DataResponse<Any>) in
            guard response.result.isSuccess else{
                Utils.hideHUD()
                Utils.showAlert(message: (response.result.error?.localizedDescription)!, action: {

                })
                return
            }
            Utils.hideHUD()
            print(response.request!)  // original URL request
            print(response.response!) // HTTP URL response
            print(response.data!)     // server data
            print(response.result)   // result of response serialization
            success(response.result.value! as! Dictionary<String, Any>)
        }
    }
}
harshal jadhav
  • 5,456
  • 2
  • 18
  • 26
0

Create Alamofire Session Manager as follows:

private var manager: Alamofire.SessionManager = 
 {

    // Create the server trust policies
    let serverTrustPolicies: [String: ServerTrustPolicy] = [
        "URL to Bypass": .disableEvaluation
    ]

    // Create custom manager
    let configuration = URLSessionConfiguration.default
    configuration.httpAdditionalHeaders = Alamofire.SessionManager.defaultHTTPHeaders
    let manager = Alamofire.SessionManager(
        configuration: URLSessionConfiguration.default,
        serverTrustPolicyManager: ServerTrustPolicyManager(policies: serverTrustPolicies)
    )

    return manager
}()

// Then, Use the above created session manager to request data as follows:

    manager.request(requestBuilder.URLString, method: requestBuilder.method, parameters: requestBuilder.parameters, encoding: requestBuilder.encoding, headers: requestBuilder.headers)
.response(responseSerializer: responseSerializer, completionHandler: { (response) in
// Response is here
}
Himanshu Ahuja
  • 197
  • 1
  • 13