跟踪我应用程序发送和接收的数据使用情况

5
如何跟踪应用程序发送和接收的数据使用情况?
我只想在我的应用程序运行时记录发送和接收的字节数。如果可以获取Wifi和移动网络的单独信息,那就太好了,但这不是优先考虑的。
我知道如何找到设备的总使用情况- https://dev59.com/Cmsz5IYBdhLWcg3wYGkz#8014012 此外,我知道我可以使用Instruments来收集网络活动数据,但我想在我的应用程序中记录这些数据,因此需要一种编程方式来实现这一点。
我尝试搜索此内容,但我找到的都是设备的网络使用情况,而不是特定应用程序的使用情况。
以下是WhatsApp设置-使用页面的截图,这将更好地说明我要做什么:

enter image description here

我正在使用AFNetworking进行HTTP请求和响应,如下所示:

NSData* requestData = [NSJSONSerialization dataWithJSONObject:info options: NSJSONWritingPrettyPrinted error:&error];
if(error != nil) {
    NSLog(@"Error: converting JSON: %@, %@", error, error.userInfo);
}

[request setHTTPMethod:@"POST"];
[request setValue:@"application/x-www-form-urlencoded; charset=UTF-8" forHTTPHeaderField:@"Content-Type"];
[request setValue:[NSString stringWithFormat:@"%d", [requestData length]] forHTTPHeaderField:@"Content-Length"];
[request setHTTPBody: requestData];

/*
    ################### ----------------- ###################
    WILL [requestData length] BE THE NUMBER OF BYTES SEND ???
    ################### ----------------- ###################
*/
NSLog(@"data bytes: %d", [requestData length]); 

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL .....];
AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest: request                                                                                 
    success: ^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {

    } failure: ^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {

}];
[operation start];

我已更新我的问题。
请问: [requestData length] 是每个请求发送的字节数吗?

1
答案可能取决于您使用的API来执行网络操作...套接字?CFNetworking?NSURLRequest?第三方解决方案?但基本思路可能是跟踪传入和传出的传输,并将它们记录到磁盘上的某个位置。 - Carl Veazey
@CarlVeazey Veazey,我正在使用AFNetworking。 - user427969
有关如何实现这个想法或建议,您有什么想法吗? - user427969
2个回答

1

我使用了Alexander提到的以下方法:

AFJSONRequestOperation *operation = [[AFJSONRequestOperation alloc] initWithRequest: request];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
    // success
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    // failure
}];

[operation setDownloadProgressBlock:^(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead) {
    // bytes received - saved bytesRead variable to NSUserDefaults
}];
[operation setUploadProgressBlock:^(NSUInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite) {
    // bytes sent - saved bytesWritten variable to NSUserDefaults
}];
[operation start];

1

根据您使用的类,有几种方法可以使用AFNetworking进行下载。

例如,AFHTTPRequestOperation具有以下方法:

setDownloadProgressBlock:^(NSInteger bytesRead, NSInteger totalBytesRead, NSInteger totalBytesExpectedToRead)

对于相反的情况,有一种方法如下:

setUploadProgressBlock:^(NSInteger bytesWritten,long long totalBytesWritten,long long totalBytesExpectedToWrite)

使用这两种方法,您应该尝试跟踪所有上传和下载的数据。

AFJSONRequestOperationAFHTTPRequestOperation的子类,因此这些方法应该在任何一个类中都可以使用。

请注意,仅向Web服务器发送“json请求”并不意味着您没有下载。当然,您必须获取内容 - json - 这将是您下载的数据。

此外,您还在质疑[requestData length]是否告诉您发送到服务器的正确大小。那不是确切的大小,因为在您的requestData中,您没有HTTP请求的其他标头,因此您的大小将比发送的原始字节小一点。

每次执行上述方法之一时,您都应该将读取的字节数添加到之前执行此方法之前读取的字节数中。当然,您必须将当前的bytesRead永久保存在coredata中,例如任何其他持久性存储中。


谢谢回复。我已经更新了我的答案。我正在使用AFJSONRequestOperation - user427969
另外,我不确定这是否重要,但我没有下载文件。我向Web服务器发送请求,并以JSON格式收到响应。 - user427969
谢谢您的回复。您提到根据我使用的类别有几种方法可供选择。您能否建议一些我可以查看的方法?我已经看过setDownloadProgressBlock,但我没有下载任何东西,我正在向Web服务器发送请求。希望您能提出建议。 - user427969
如果您向服务器发送请求,那么您确实正在下载某些内容。同样,如果您仅请求网站,则必须传递内容。AFJSONRequestOperation是AFHTTPRequestOperation的子类,因此您可以尝试使用我上面提到的方法。对于其他情况,上传某些内容,您可以尝试保存要发送到服务器的字节。请查看我的编辑,有两种方法可供选择。 - Alexander
非常感谢,它运行良好。请原谅我在下载和上传数据方面的知识不足。当我搜索有关方法时,我只发现了与文件相关的用法,这让我感到困惑。再次感谢。 - user427969

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接