0

我知道可以通过 iphone 的内置设置检查 wifi 和 Data 的流量使用情况。但是有没有像库或函数这样的解决方案来获取设备的实时网络使用情况(上传/下载)?(像实时网络统计)

可达性是我发现的关于提到的事情之一。 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 回答
-1

iOS中没有这样的API,您提到的App(以及所有类似的应用程序)依赖于运营商提供的API(或解析运营商网站)。如果你想实现这种App,恐怕你必须为你感兴趣的每一个可能的运营商找到一些东西。

于 2013-05-07T23:28:58.863 回答