Ios 我想获取UIWebView在加载任何URL时使用的数据(字节、KB或MB)?

Ios 我想获取UIWebView在加载任何URL时使用的数据(字节、KB或MB)?,ios,objective-c,xcode5,nsurlconnection,uiwebviewdelegate,Ios,Objective C,Xcode5,Nsurlconnection,Uiwebviewdelegate,我正在开发一个浏览器应用程序,我想跟踪加载网页时消耗了多少internet数据。 我使用此方法计算iOS应用程序接收的数据 - (void)connectionDidFinishLoading:(NSURLConnection *)connection{ NSLog(@"Did Receive Data %i", [resourceData length]); length += [resourceData length]; NSLog(@"Data in MB: %.3f",(length/(

我正在开发一个浏览器应用程序,我想跟踪加载网页时消耗了多少internet数据。 我使用此方法计算iOS应用程序接收的数据

- (void)connectionDidFinishLoading:(NSURLConnection *)connection{
NSLog(@"Did Receive Data %i", [resourceData length]);
length += [resourceData length];
NSLog(@"Data in MB: %.3f",(length/(1024*1024)));
}
我在iOS模拟器和android的相同浏览器应用程序中打开。 当页面加载完成时,iOS应用程序显示使用的20KB数据,而android应用程序显示使用的280KB数据。 在android中,有一个类用于获取活动会话中使用的数据,该类的名称是TrafficStats。我搜索了很多,但在iOS中,我没有找到任何具有类似特性的类或方法

在调用webViewDidFinishLoading以获取webView加载该页面所使用的实际数据时,我也尝试了这段代码

-(void)webViewDidFinishLoad:(UIWebView *)webView{

NSString* script = @"document.documentElement.outerHTML.length";
length += [[webBrowser stringByEvaluatingJavaScriptFromString:script] floatValue];
NSLog(@"Data in MB: %.3f",(length/(1024*1024)));

//[self performSelectorOnMainThread:@selector(dataUsedByApp) withObject:nil waitUntilDone:5.0];
}
但这也不准确,因为它不计算图像的大小,而大小是用@“document.documentElement.outerHTML.length”计算的

请帮我做这件事。:)

使用方法:

但是在这里,为了获取图像的URL,您需要解析整个HTML,它是通过以下方式得到响应的

希望这就是你要找的

更新:

  • 获取html页面大小:
NSData*resultData=[NSData dataWithContentsOfURL:@''

  • 解析页面中的所有资源。为此,您需要对整个数据响应进行XML解析。(通过将转换为NSString),您可能需要查看internet
  • 一旦获得了logo.gif的所有资源URL,就可以单独获取其NSData长度
  • 最后,总结所有这些是您的解决方案:
PageSize+AllResourcesSize=整个页面加载大小

您可以使用开源WebViewProxy()截获请求

我可以想象,如果您想要跟踪所有http流量,或者您可以更改谓词以适合您的情况,这将起作用:

[WebViewProxy handleRequestsMatching:[NSPredicate predicateWithFormat:@"absoluteString MATCHES[cd] '^http:'"] handler:^(NSURLRequest* req, WVPResponse *res) {
    [NSURLConnection sendAsynchronousRequest:[NSURLRequest requestWithURL:req.URL] queue:queue completionHandler:^(NSURLResponse *netRes, NSData *data, NSError *netErr) {
        //do your transfer logging here
        ....
        [res respondWithData:data mimeType:netRes.MIMEType];
    }];
}];

这对我来说不起作用,因为它不会计算将自动加载的图像大小。假设您正在打开www.google.com,在这种情况下,NSData*resultData=[NSData DATA WITH CONTENTS OFURL:@“resultData不包含将在google页面上显示的图像大小。上面的行仅返回html长度。请尝试运行代码,您将获得20654字节左右的大小,只有20KB。但google页面的实际大小为330KB(如android应用程序所示)。这很好。但我想打开并获取它的数据大小(字节)。当我使用上述代码时,它只给出20KB,但android中的同一url显示页面加载大小330KB。我确信这不会给出android应用程序返回的实际大小。NSData*resultData=[NSData data WITH CONTENTS OFURL:@“更清楚的是,页面大小与加载大小不同。可能有其他资源不在页面中,但来自其他地方。因此,当您获取页面数据(作为NSData)时,它不知道其中使用的图像,因为这些图像位于某个服务器位置。
[WebViewProxy handleRequestsMatching:[NSPredicate predicateWithFormat:@"absoluteString MATCHES[cd] '^http:'"] handler:^(NSURLRequest* req, WVPResponse *res) {
    [NSURLConnection sendAsynchronousRequest:[NSURLRequest requestWithURL:req.URL] queue:queue completionHandler:^(NSURLResponse *netRes, NSData *data, NSError *netErr) {
        //do your transfer logging here
        ....
        [res respondWithData:data mimeType:netRes.MIMEType];
    }];
}];