【问题标题】:track usage of data sent and received through my app跟踪通过我的应用发送和接收的数据的使用情况
【发布时间】:2013-01-22 02:34:39
【问题描述】:

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

我只想记录我的应用程序运行时发送和接收的字节数。如果我能获得 Wifi 和蜂窝网络的单独信息,那就太好了,但不是优先事项。

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

另外,我知道我可以使用 Instruments 来收集网络活动数据,但我想在我的应用中记录这些数据,因此需要一种编程方式来执行此操作。

我试图搜索这个,但我发现的只是设备的网络使用情况,而不是特定应用的使用情况。

以下是 Whatsapp 的设置 -> 使用页面的屏幕截图,可以更好地了解我想要做什么:

我使用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] 是一个请求的发送字节数吗?

【问题讨论】:

  • 答案可能取决于您使用什么 API 来进行网络...套接字? CF网络? NSURL请求?第三方解决方案?但基本的想法可能是跟踪进出的传输并将它们记录到某个地方的磁盘上。
  • @CarlVeazey Veazey 我正在使用 AFNetworking
  • 关于如何实现这个的任何想法或建议?

标签: ios ios6


【解决方案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 或任何其他持久性存储中。

【讨论】:

  • 感谢您的回复。我已经更新了我的答案。我正在使用AFJSONRequestOperation
  • 另外,我不确定这是否重要,但我没有下载文件。我向 Web 服务器发送请求并以 JSON 格式返回响应。
  • 感谢您的回复。你提到有几种方法取决于我使用的类。您能否建议一些我可以研究的方法?我已经看到 setDownloadProgressBlock 但我没有下载任何东西,我正在向 Web 服务器发送请求。我希望你能提出一些建议。
  • 如果您向服务器发送请求,您确实在下载某些内容。同样,如果您只请求一个网站,则必须交付内容。 AFJSONRequestOperation 是 AFHTTPRequestOperation 的子类,所以你可以尝试使用我上面提到的方法。对于另一种情况,上传一些东西,你可以尝试保存你要发送到服务器的字节。查看我的编辑,有两种方法可以使用
  • 非常感谢它运行良好。请原谅我对下载和上传数据的了解。当我搜索这些方法时,我只发现有关文件的用途,这让我感到困惑。再次感谢。
【解决方案2】:

我使用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];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-06
    • 2012-04-08
    • 2011-09-30
    • 2014-01-27
    • 2015-07-07
    • 1970-01-01
    相关资源
    最近更新 更多