Расчет скорости сети в iOS. Время в оба конца с меньшим количеством данных не сообщит о точной скорости сети

Я пытаюсь рассчитать скорость сети в своем приложении, поэтому я могу загружать только ту часть данных, которая может быть загружена в таких условиях сети. Для этого мой план:

  1. Мое приложение будет иметь скорость по умолчанию может быть (500 КБ / с).
  2. Мое приложение отправит запрос с 500 КБ данных.
  3. Он будет следить за временем прохождения сигнала в оба конца, чтобы загрузить данные и получить ответ. Например, приложение получило 200 КБ данных за 5 секунд, после чего скорость будет (500+200)/5.
  4. Согласно приведенному выше примеру, моя пропускная способность составляет 140 КБ / с для этого запроса.
  5. Я буду рассчитывать экспоненциальное скользящее среднее из моей пропускной способности.
  6. Я отправлю следующий запрос на основе рассчитанной средней пропускной способности.

Вот моя реализация для NSURLSession:

//Initializing NSURLSession [one time only]
let configuration = NSURLSessionConfiguration.backgroundSessionConfigurationWithIdentifier("com.test.ios.background")
self.backgroundSession = NSURLSession(configuration: configuration, delegate: self, delegateQueue: nil)

// Create session task: 
var urlSessionTask = self.backgroundSession.uploadTaskWithRequest(request, fromFile: NSURL.fileURLWithPath(filePath!)) urlSessionTask.resume() 
let requestStartTime = NSDate().timeIntervalSinceReferenceDate

//On didCompleteWithError calculating speed.
func URLSession(session: NSURLSession, task: NSURLSessionTask, didCompleteWithError error: NSError?) {
    let downloadEndTime = NSDate().timeIntervalSinceReferenceDate
    let networkSpeed = Int(Double(sessionTask.receivedData.length + task.countOfBytesSent) / (downloadEndTime - requestStartTime))
}

Если я теряю пропускную способность, я могу найти ее, используя этот подход, поскольку мое среднее значение снижается, но проблема заключается в том, что, как только я достиг низкой пропускной способности и чем улучшаются условия моей сети, моя пропускная способность не улучшится, потому что я продолжаю посылать меньше данных в запросе, и он будет продолжать говорить, что пропускная способность низкая.

Есть ли способ узнать, улучшилось ли состояние моей сети, и могу ли я отправлять больше данных?

На мой взгляд, одно решение заключается в том, что я могу отправлять максимум данных (может быть 500 КБ) в каждом 10-м запросе, поэтому в это время я могу получить более высокую пропускную способность в условиях сети, которые улучшаются.

1 ответ

Чтобы получить такие показатели, как время начала и окончания запроса, я бы порекомендовал реализовать следующий метод делегата в вашем URLSession

@available(iOS 10.0, *)
optional public func urlSession(_ session: URLSession, task: URLSessionTask, didFinishCollecting metrics: URLSessionTaskMetrics)

URLSessionTaskMetrics содержит свойство taskInterval который даст вам время поездки туда и обратно.

Что касается динамического изменения объема данных, которые вы отправляете, я не понимаю подход. Независимо от размера вашего тела запроса, ваше приложение ограничено пропускной способностью сети; который находится вне вашего контроля. Вы можете попробовать использовать новый URLSessionConfiguration свойство максимизировать пропускную способность сети:

@available(iOS 11.0, *)
open var multipathServiceType: URLSessionConfiguration.MultipathServiceType

Я рекомендую оставить заявку body как есть и позволяя ОС разобраться с мельчайшими деталями оптимизации для плохого сетевого подключения.

Другие вопросы по тегам