2013-01-21 30 views
0

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

可达性的,我发现相对于所提到的事情之一。 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

有谁知道叫什么类或寻找某些东西的方法来访问实时交通?

我希望我的问题是可以理解的。

+0

您是在谈论跟踪应用程序的使用情况还是整体情况? – sangony

回答

0

有一个在iOS上,你提到的应用(以及所有类似的应用程序)没有这样的API,依靠由承运人(或解析运营商网站)提供的API。如果你想实现这种应用程序的,恐怕你要找到一个对每一个可能载你感兴趣的内容。

0

没有高水平的API来支持这一点,但由于iOS的仅仅是一个相当漂亮unix,你当然可以去标准的API。

在这种情况下,你要寻找getifaddrs,它检索描述设备上的各种接口的存储器结构中。

你就必须分析这些C结构,以得到你想要的接口细节。

getifaddr界面记录(man getifaddr),所以你可以使用这个。

我会添加一些代码,但首先要注意几点。 苹果公司并不打算维持这个东西,所以网络计数是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; 
    } 

P.S.我要为我的钻石复活旧问题徽章:)