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

时间:2013-01-22 02:34:39

标签: ios ios6

如何跟踪通过我的应用发送和接收的数据的使用情况?

我只想记录我的应用运行时发送和接收的字节数。如果我可以获得Wifi和蜂窝网络的单独信息,那么它会很棒但不是优先考虑的事情。

我知道如何查找设备的总使用情况 - https://stackoverflow.com/a/8014012/427969

此外,我知道我可以使用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]是一个请求的字节数SEND吗?

2 个答案:

答案 0 :(得分:1)

有几种方法取决于您使用AFNetworking

下载哪个类 例如,

AFHTTPRequestOperation具有以下方法:

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

换句话说,有一种方法:

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

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

AFJSONRequestOperationAFHTTPRequestOperation的子类,因此这些方法应该适用于任何一个类。

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

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

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

答案 1 :(得分:1)

我使用亚历山大提到的方法如下:

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];