有没有办法测量iOS中的延迟?

时间:2014-11-17 19:30:47

标签: ios connectivity

我想解决的问题是,我希望有一种方法来测量网络延迟,并在发生高延迟情况时通知用户。我的应用程序允许用户从在线资源中流式传输音频或视频内容,并且在我的测试中可以以3g甚至EDGE的速度播放,延迟时间的峰值可能会导致可用性的挂起。当发生这种情况时,我希望能够提醒用户这些问题的原因。

我回过头来研究Apple的Reachability示例代码,但它仍然无济于事。我将回顾一年前提交的一个问题(http://openradar.appspot.com/13982938

假设我从一个强大的连接开始,我可以在网络链路调节器中设置一个自定义配置文件,该配置文件将丢弃100%发送的数据包,示例应用程序中的可访问性代码不会改变肯定结果。即使没有数据包通过,它仍然告诉我我有连接。

为了获取此信息,我可以KVO或以其他方式听取任何可靠的值吗?

2 个答案:

答案 0 :(得分:2)

最简单的方法(可能是唯一真正有效的方法)是在发送请求时存储时间值,并在收到响应时评估延迟。你可以在这里查看AFNetworkActivityLogger如何解决这个问题 https://github.com/AFNetworking/AFNetworkActivityLogger/blob/master/AFNetworkActivityLogger/AFNetworkActivityLogger.m

最重要的一行是

objc_setAssociatedObject(notification.object, AFNetworkRequestStartDate, [NSDate date], OBJC_ASSOCIATION_RETAIN_NONATOMIC);

发送请求时

NSTimeInterval elapsedTime = [[NSDate date] timeIntervalSinceDate:objc_getAssociatedObject(notification.object, AFNetworkRequestStartDate)];

收到回复时。

如何将此逻辑集成到您的代码中取决于您使用什么来获取流式视频。

答案 1 :(得分:1)

  

我的应用允许用户从在线资源中流式传输音频或视频内容

一些内置的流式传输方式可以告诉您发生了什么。如果您使用的是AVPlayerItem,playbackLikelyToKeepUpaccessLog等属性以及AVPlayerItemPlaybackStalledNotification等通知可以帮助您及时了解任何问题。