[解決済み] iPhoneのデータ使用量のトラッキング/モニタリング
質問
このトピックについて検索してみましたが、参考になるような詳細はほとんど見つかりませんでした。これらの詳細で、私は次のようにいくつかのコードを調理しようとしました。
注:これをDUPLICATEとしてマークする前に、この投稿で共有された詳細を他の投稿と比較してください。
- (NSArray *)getDataCountersForType:(int)type {
BOOL success;
struct ifaddrs *addrs = nil;
const struct ifaddrs *cursor = nil;
const struct sockaddr_dl *dlAddr = nil;
const struct if_data *networkStatisc = nil;
int dataSent = 0;
int dataReceived = 0;
success = getifaddrs(&addrs) == 0;
if (success) {
cursor = addrs;
while (cursor != NULL) {
if (cursor->ifa_addr->sa_family == AF_LINK) {
dlAddr = (const struct sockaddr_dl *) cursor->ifa_addr;
networkStatisc = (const struct if_data *) cursor->ifa_data;
if (type == WiFi) {
dataSent += networkStatisc->ifi_opackets;
dataReceived += networkStatisc->ifi_ipackets;
}
else if (type == WWAN) {
dataSent += networkStatisc->ifi_obytes;
dataReceived += networkStatisc->ifi_ibytes;
}
}
cursor = cursor->ifa_next;
}
freeifaddrs(addrs);
}
return [NSArray arrayWithObjects:[NSNumber numberWithInt:dataSent], [NSNumber numberWithInt:dataReceived], nil];
}
このコードは、iPhoneデバイスのインターネット利用情報を収集します(私のアプリケーションだけの情報ではありません)。
さて、WiFiや3Gでインターネットを利用した場合、データ(バイト)だけを
ifi_obytes
(送信) と
ifi_ibytes
(受信)の2種類がありますが、WiFiの利用状況は
ifi_opackets
と
ifi_ipackets
.
また、WiFi ネットワークに接続していても、インターネットを使用していない場合は、追加された値を
ifi_obytes
と
ifi_ibytes
.
もしかしたら、私の実装や理解に間違いがあるかもしれません。どなたか助けてください。
編集:代わりに
AF_LINK
の代わりに
AF_INET
(
sockaddr_in
の代わりに
sockaddr_dl
). これはアプリケーションをクラッシュさせます。
どのように解決するのですか?
それは
pdp_ip0
はインターフェースの一つであり、全ての
pdpXXX
は
WWAN
は、異なる機能、ボイスメール、一般的なネットワーク インターフェースに特化したインターフェースです。
私は Apple フォーラムで次のように読みました。 OS は、プロセスごとにネットワークの統計情報を保持しません。そのため、この問題に対する正確な解決策はありません。しかし、各ネットワーク インターフェイスのネットワーク統計情報を取得することはできます。
一般に
en0
はあなたの
Wi-Fi
インターフェースであり
pdp_ip0
はあなたの
WWAN
インターフェースです。
特定の日時以降の無線LAN/携帯電話ネットワークのデータを取得する良い方法はありません!
データ統計(
ifa_data->ifi_obytes
と
ifa_data->ifi_ibytes
) は、前回のデバイス再起動時から保存されています。
なぜかわからないのですが
ifi_opackets
と
ifi_ipackets
だけが表示されます。
lo0
(にのみ表示されます(メインインターフェースだと思います)。
はい、デバイスは
WiFi
で接続され、インターネットを使用しない
if_iobytes
の値は、このメソッドがインターネットだけでなく、ネットワークバイトの交換を提供するため、まだ来る。
#include <net/if.h>
#include <ifaddrs.h>
static NSString *const DataCounterKeyWWANSent = @"WWANSent";
static NSString *const DataCounterKeyWWANReceived = @"WWANReceived";
static NSString *const DataCounterKeyWiFiSent = @"WiFiSent";
static NSString *const DataCounterKeyWiFiReceived = @"WiFiReceived";
NSDictionary *DataCounters()
{
struct ifaddrs *addrs;
const struct ifaddrs *cursor;
u_int32_t WiFiSent = 0;
u_int32_t WiFiReceived = 0;
u_int32_t WWANSent = 0;
u_int32_t WWANReceived = 0;
if (getifaddrs(&addrs) == 0)
{
cursor = addrs;
while (cursor != NULL)
{
if (cursor->ifa_addr->sa_family == AF_LINK)
{
#ifdef DEBUG
const struct if_data *ifa_data = (struct if_data *)cursor->ifa_data;
if (ifa_data != NULL)
{
NSLog(@"Interface name %s: sent %tu received %tu",cursor->ifa_name,ifa_data->ifi_obytes,ifa_data->ifi_ibytes);
}
#endif
// name of interfaces:
// en0 is WiFi
// pdp_ip0 is WWAN
NSString *name = @(cursor->ifa_name);
if ([name hasPrefix:@"en"])
{
const struct if_data *ifa_data = (struct if_data *)cursor->ifa_data;
if (ifa_data != NULL)
{
WiFiSent += ifa_data->ifi_obytes;
WiFiReceived += ifa_data->ifi_ibytes;
}
}
if ([name hasPrefix:@"pdp_ip"])
{
const struct if_data *ifa_data = (struct if_data *)cursor->ifa_data;
if (ifa_data != NULL)
{
WWANSent += ifa_data->ifi_obytes;
WWANReceived += ifa_data->ifi_ibytes;
}
}
}
cursor = cursor->ifa_next;
}
freeifaddrs(addrs);
}
return @{DataCounterKeyWiFiSent : @(WiFiSent),
DataCounterKeyWiFiReceived : @(WiFiReceived),
DataCounterKeyWWANSent : @(WWANSent),
DataCounterKeyWWANReceived : @(WWANReceived)};
}
コピー&ペーストのサポートが改善されました!
関連
-
[解決済み] iPhone UITextField - プレースホルダーの文字色を変更する
-
[解決済み] iPhone 5の画面解像度に対応したアプリを開発・移行するには?
-
[解決済み] UITextViewのキーボードをリターンキーで解除するには?
-
[解決済み】iPhoneアプリケーションにカスタムフォントを埋め込むことはできますか?
-
[解決済み] UITextFieldのキーボードの種類をプログラムで変更する
-
[解決済み] .xibファイルと.storyboardの違いは何ですか?
-
[解決済み] iPhoneのTableViewのCellの右側に小さな矢印を追加する
-
[解決済み] Objective-C 2.0でメソッドに非推奨のフラグを立てるにはどうすればよいですか?
-
[解決済み] UIViewのサブビューをセンタリングする方法
-
[解決済み] iPhone 5 CSSメディアクエリ
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] UILongPressGestureRecognizerが押し下げ時に2回呼び出される
-
[解決済み] UINavigationControllerに右ボタンを追加する方法は?
-
[解決済み] xcodeでiOSアプリのアーカイブを生成できない
-
[解決済み] .xibファイルと.storyboardの違いは何ですか?
-
[解決済み] モバイルSafari(iPhone)でテキストエリアのインナーシャドウを除去する
-
[解決済み] UITableViewHeaderFooterView。背景色を変更できない
-
[解決済み] ITunesのレビューURLとiOS 7(ユーザーにアプリを評価してもらう)AppStoreに空白のページが表示される。
-
[解決済み] Mac OS Xのスタティック・ライブラリ(.a)のターゲット・アーキテクチャはどのように決定するのですか?
-
[解決済み] 円形のカスタムUIViewの描き方 - iPhoneアプリ
-
[解決済み] ObjectiveCの変数位置の宣言・定義?