在iOS中计算网络速度。使用较少数据的往返时间不会通知准确的网络速度

时间:2016-03-07 08:39:27

标签: ios swift nsurlsession nsurlsessiontask

我正在尝试在我的应用中计算网络速度,因此我只能上传那些可以在这种网络条件下上传的数据。为此我的计划是:

  1. 我的应用程序的默认速度可能是(500KB / s)。
  2. 我的应用会发送包含500kb数据的请求。
  3. 它将监控系统上传数据并获得响应所需的往返时间。例如,应用程序在5秒内收到200kb数据,而速度将为(500 + 200)/ 5。
  4. 根据上面的示例,该请求的带宽为140KB / s。
  5. 我将从我的带宽计算指数移动平均线。
  6. 我会根据计算的平均带宽发送下一个请求。
  7. 这是我对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))
    }
    

    如果我放宽带宽,我可以使用这种方法找到它,因为我的平均值下降,但问题是一旦我达到低带宽并且我的网络条件得到改善,我的带宽将不会得到改善,因为我保持在请求中发送较少的数据,并且会继续说带宽很低。

    如果我的网络条件得到改善并且我可以发送更多数据,我有什么方法可以找到它吗?

    我想到的一个解决方案是,我可以在每10个请求中发送最大数据(可能是500KB),所以那时我可以在网络条件下获得更高的带宽。

1 个答案:

答案 0 :(得分: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,并让操作系统处理针对不良网络连接进行优化的更精细细节。