taskWillPerformHTTPRedirection никогда не вызывается в Alamofire 5 - PullRequest
1 голос
/ 23 марта 2020

Обновление Alamofire до 5.0.4. Как видно из названия, taskWillPerformHTTPRedirection никогда не вызывается.

В Alamofire 4.x мы могли бы сделать что-то вроде:

  let sessionDelegate =  request.session.delegate as! Alamofire.SessionDelegate

  sessionDelegate.taskWillPerformHTTPRedirection = { session, task, response, request in
    if let url = task.currentRequest?.url {
        // look at redirected url & act accordingly
      }
    }
  }

Сессия / делегат запроса была пересмотрена в Alamofire 5 и является больше не доступен напрямую из запроса. В частности, taskWillPerformHTTPRedirection является обратным вызовом закрытия на ClosureEventMonitor. В качестве проверки работоспособности я протестировал с использованием некоторых других обратных вызовов замыкания ... и они сработали.

// ClosureEventMonitor

  let monitor = ClosureEventMonitor()
  monitor.requestDidCreateTask = { request, task in
     // Event fires
  }

  let monitor2 = ClosureEventMonitor()
  monitor2.taskWillPerformHTTPRedirection = { sess, task, resp, req in
   // Event Never fires
  }

  monitor2.requestDidFinish = { request in
    // Event Fires
  }

  // Set up Session
  var session: Session? = Session(startRequestsImmediately: false, eventMonitors: [monitor, monitor2])

  let url = URL(string: "https://google.com")!
  let urlRequest = URLRequest(url: url)

  let trequest = session?.request(urlRequest)

Для справки этот код запускается из моего AppDelegate func application(_ application: UIApplication, continue userActivity: NSUserActivity для обработки глубоких / универсальных ссылок .

Я не совсем уверен, чего мне здесь не хватает. Любая помощь очень ценится. Спасибо за ваше время.

1 Ответ

1 голос
/ 24 марта 2020

Здесь есть три вещи:

Во-первых, session?.request(urlRequest) фактически никогда не сделает запрос, поскольку вы никогда не вызовете resume() (или не подключите обработчик ответа).

Во-вторых, использовать один Session как это не рекомендуется. Как только Session выходит из области видимости, все запросы будут отменены.

В-третьих, EventMonitor s не может взаимодействовать с конвейером запросов, они являются только наблюдательными. Вместо этого используйте новый протокол RedirectHandler Alamofire 5 или тип Redirector для обработки перенаправлений. Больше в нашей документации . Простая реализация, которая настраивает выполняемое действие:

let redirector = Redirector(behavior: .modify { task, request, response in
    // Customize behavior.
})
session?.request(urlRequest).redirect(using: redirector)
...