5

アプリを通じて送受信されたデータの使用状況を追跡するにはどうすればよいですか?

アプリの実行中に送受信されたバイトを記録したいだけです。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]1回のリクエストでSENDするバイト数は?

4

2 に答える 2

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];
于 2013-02-13T05:14:03.657 に答える
1

ダウンロードに使用しているクラスに応じて、いくつかのメソッドがありますAFNetworking

AFHTTPRequestOperationたとえば、次のメソッドがあります。

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

逆に、次のような方法があります。

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

この to メソッドを使用して、アップロードおよびダウンロードしたすべてのデータを追跡するようにしてください。

AFJSONRequestOperationは のサブクラスでAFHTTPRequestOperationあるため、これらのメソッドはどちらのクラスでも機能するはずです。

また、「json リクエスト」を Web サーバーに送信するだけでは、ダウンロードしていないことにはならないことに注意してください。確かに、ダウンロードされたデータであるコンテンツ(json)を取得する必要があります。

[requestData length]さらに、サーバーに送信された適切なサイズを示しているかどうかを質問します。これは正確なサイズではありません。requestData 内には HTTP 要求用の追加のヘッダーがないため、サイズは送信された元のバイト数よりも少し小さくなります。

上記のメソッドのいずれかが実行されるたびに、読み取られたバイトの結果を追加し、このメソッドが実行される前に読み取ったバイトに追加する必要があります。たとえば、現在の bytesRead をコアデータやその他の永続ストアに永続的に保存する必要があります。

于 2013-01-22T07:41:16.120 に答える