Дайджест с использованием URLSession или Alamofire не прошел через некоторое время - PullRequest
0 голосов
/ 06 января 2019

Я пытаюсь выполнить дайджест-проверку подлинности с использованием URLSession.

class AuthenticateHandler: NSObject, URLSessionTaskDelegate,URLSessionDelegate {

 func urlSession(_ session: URLSession, task: URLSessionTask, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {
    let credentials = URLCredential(user: UserDefaults.standard.string(forKey: "userName") ?? "admin", password: UserDefaults.standard.string(forKey: "password") ?? "admin", persistence: URLCredential.Persistence.forSession)
    completionHandler(URLSession.AuthChallengeDisposition.useCredential,credentials)
  }
}

Звонок в диспетчер:

class CameraManager: NSObject, NetworkProtocols {

  let handler = AuthenticateHandler()
  var urlSession: URLSession?


     override init() {
      super.init()
            let config = URLSessionConfiguration.default
      config.requestCachePolicy = .reloadIgnoringLocalAndRemoteCacheData
      config.urlCache = nil

      self.urlSession = URLSession(configuration: config, delegate: handler, delegateQueue: OperationQueue.main)
  }

     func imageCall(url: String , success: @escaping (UIImage) -> Void, failure: @escaping () -> Void) {

        let imageThumbnailTask = urlSession?.dataTask(with: URL(string:url)!) { data, res, err in

            if err != nil {
                print("error from dataResponse:\(err?.localizedDescription ?? "Response Error")")
                failure()
            }

            if let imageData = data, let image = UIImage(data: imageData) {
                success(image)
            }
        }
        imageThumbnailTask?.resume()
    }
}

И класс, который реализует это так:

   self.network.imageCall(url: self.isShowingThermal ? self.thermalUrl : self.visualUrl, success: { [weak self] (image) in
        self?.indicaotrTimer?.invalidate()
        self?.imageLoaderIndicator.stopAnimating()
        DispatchQueue.main.async{
            self?.seconds = 1
            self?.backGroundImageView.image = image
        }
        if self?.isInVC ?? false {
            self?.imageBackgroundCall()
        }
    }) {
        if self.isInVC  {
            self.imageBackgroundCall()
        }
    }

Через некоторое время я получаю странное поведение, дайджест перестает работать с кодом состояния: 401, Заголовки (не появляется ошибка - imageThumbnailTask ​​показывают в ответе 401). При отладке он по какой-то причине останавливается в классе AuthenticateHandler. Ответ выглядит так:

Есть идеи?

result: Optional(<NSHTTPURLResponse: 0x1d4237940> { URL: http://192.168.42.1/images/snapshots/DLTVimage.jpeg } { Status Code: 401, Headers {
Connection =     (
    "keep-alive"
);
"Content-Length" =     (
    195
);
"Content-Type" =     (
    "text/html"
);
Date =     (
    "Mon, 07 Jan 2019 00:13:17 GMT"
);
} })

p.s

Пробовал также с Alamofire, вот так:

class CameraManager: NSObject, NetworkProtocols {

 var sessionMananager: Alamofire.SessionManager?
override init() {
    super.init()
    initAlamoSession()
 }

func initAlamoSession() {
    self.credential = URLCredential(user: UserDefaults.standard.string(forKey: "userName") ?? "admin", password: UserDefaults.standard.string(forKey: "password") ?? "admin", persistence: .forSession)
    let config = URLSessionConfiguration.default
    config.requestCachePolicy = .reloadIgnoringLocalAndRemoteCacheData
    config.urlCache = nil

    self.sessionMananager = Alamofire.SessionManager(configuration: config)
}

func imageCall(url: String , success: @escaping (UIImage) -> Void, failure: @escaping () -> Void) {
    print("imageCall")

     sessionMananager?.request(url)
        .authenticate(usingCredential: self.credential!)
        .responseJSON { response in
            print("Result: \(String(describing: response.response?.statusCode))")

            if let data = response.data {
                if let image = UIImage(data: data) {
                    print("imageCal success")
                    success(image)
                } else {
                    print("imageCal failure")
                    failure()
                }
            } else {
                failure()
            }
    }
 }
}
...