0

iPhoneの組み込み設定を使用して、wifiとデータのトラフィック使用量を確認できることを知っています。しかし、デバイスのネットワーク使用状況 (アップロード/ダウンロード) をリアルタイムで取得するためのライブラリや関数のようなソリューションはありますか? (リアルタイムの netstat のように)

到達可能性は、言及に関して私が見つけたものの1つです。 http://developer.apple.com/library/ios/#samplecode/Reachability/Introduction/Intro.html#//apple_ref/doc/uid/DTS40007324-Intro-DontLinkElementID_2

このアプリは似たようなことをします: https://itunes.apple.com/us/app/data-control-manage-data-usage/id390646992?mt=8

リアルタイム トラフィックにアクセスするために、どのクラスを呼び出すか、特定のメソッドを探すかを知っている人はいますか?

私の質問が理解できることを願っています。

4

2 に答える 2

1

これをサポートするための高レベル API はありませんが、iOS はかなり単純な UNIX であるため、もちろん標準 API を使用できます。

この場合、getifaddrs を探します。これは、デバイスのさまざまなインターフェイスを記述するメモリ内構造体を取得します。

次に、必要なインターフェイスの詳細を取得するために、これらの C 構造を解析する必要があります。

getifaddr インターフェイス文書化されているので (man getifaddr)、これを使用できます。

少しコードを追加しますが、最初にいくつかの注意事項があります。Apple はこのようなことをあまり気にしないので、ネットワーク カウントは 32 ビットなので、4Gb のロールオーバーを処理する必要があります。パケット数はほとんどあります。tx パケット数は常に 0 だと思いますが、とにかくパケット数に興味がある人はいますか。

ここで getifaddrs を検索すると、より適切なコードが見つかる可能性がありますが、ここに短いバージョンがあります。

#include <sys/types.h>
#include <sys/sysctl.h>
#include <sys/socket.h>
#include <ifaddrs.h>
#include <net/if_var.h>

    struct ifaddrs* addrs;

    int getIFAddrsResult = getifaddrs(&addrs);
    if (getIFAddrsResult == 0)
    {
        struct ifaddrs* addrsPtr = addrs; // need to keep original for freeifaddrs
        while (addrsPtr != NULL)
        {
            NSString *name = [NSString stringWithFormat:@"%s",addrsPtr->ifa_name];
            //NSLog(@"ifa_name %s == %@\n", cursor->ifa_name,name);
            // names of interfaces: en0 is WiFi ,pdp_ip0 is WWAN

            if (addrsPtr->ifa_addr->sa_family == AF_LINK)
            {
                const struct if_data* stats = (const struct if_data *) addrsPtr->ifa_data;

                // We only consider the active data interface, and that will normally be the '0' interface.
                if ([name isEqualToString:@"en0"])
                {
                     // Wifi
                     // look at stats->ifi_obytes & ifi_ibytes

                } else if ([name isEqualToString:@"pdp_ip0"])
                {
                   // mobile broad band
                } else {
                   // could be bluetooth, usb, ad hoc wifi, out of band signalling...
                }
            }

            addrsPtr = addrsPtr->ifa_next;
        }

        freeifaddrs(addrs);
    } else {
        NSLog(@"getifaddrs failed with error : %s", strerror(getIFAddrsResult));
        return nil;
    }

PS私は私のダイヤモンド復活の古い質問バッジに行きます:)

于 2016-07-05T13:11:59.663 に答える