2015-04-06 109 views

回答

5

这里有一个可能的实现。

首先,在您的Objective-C ifaddrs桥接报:

#include <ifaddrs.h> 

然后,尝试这个功能:

func getDataUsage() -> (wifi : (sent : UInt32, received : UInt32), wwan : (sent : UInt32, received : UInt32)) { 
    var interfaceAddresses : UnsafeMutablePointer<ifaddrs> = nil 
    var networkData: UnsafeMutablePointer<if_data> = nil 

    var returnTuple : (wifi : (sent : UInt32, received : UInt32), wwan : (sent : UInt32, received : UInt32)) = ((0, 0), (0, 0)) 

    if getifaddrs(&interfaceAddresses) == 0 { 
     for var pointer = interfaceAddresses; pointer != nil; pointer = pointer.memory.ifa_next { 

      let name : String! = String.fromCString(pointer.memory.ifa_name) 
      println(name); 
      let flags = Int32(pointer.memory.ifa_flags) 
      var addr = pointer.memory.ifa_addr.memory 

      if addr.sa_family == UInt8(AF_LINK) { 
       if name.hasPrefix("en") { 
        networkData = unsafeBitCast(pointer.memory.ifa_data, UnsafeMutablePointer<if_data>.self) 
        returnTuple.wifi.sent += networkData.memory.ifi_obytes 
        returnTuple.wifi.received += networkData.memory.ifi_ibytes 
       } else if name.hasPrefix("pdp_ip") { 
        networkData = unsafeBitCast(pointer.memory.ifa_data, UnsafeMutablePointer<if_data>.self) 
        returnTuple.wwan.sent += networkData.memory.ifi_obytes 
        returnTuple.wwan.received += networkData.memory.ifi_ibytes 
       } 
      } 
     } 

     freeifaddrs(interfaceAddresses) 
    } 

    return returnTuple 
} 

它返回一个代表4个数据,你要求的嵌套斯威夫特元组。这使得访问变得容易。例如:

let usage = getDataUsage() 
let wifiDataSentString = "WiFi Data Sent: \(usage.wifi.sent)" 
+0

谢谢我检查:)所以我真的在IOS开发新的,所以它会帮助我很多! – BilalReffas 2015-04-06 00:38:55

+0

函数只返回0的数据使用?:( – BilalReffas 2015-04-06 01:01:59

+0

@BilalReffas它为我工作,你如何运行它? – 2015-04-06 01:24:38

0

更新@Aaron Brager答案斯威夫特4和Xcode的9

func getDataUsage() -> (wifi : (sent : UInt32, received : UInt32), wwan : (sent : UInt32, received : UInt32)) { 
    var interfaceAddresses : UnsafeMutablePointer<ifaddrs>? = nil 
    var networkData: UnsafeMutablePointer<if_data>? = nil 
    var pointer: UnsafeMutablePointer<ifaddrs>? = nil 

    var returnTuple : (wifi : (sent : UInt32, received : UInt32), wwan : (sent : UInt32, received : UInt32)) = ((0, 0), (0, 0)) 

    if getifaddrs(&interfaceAddresses) == 0 { 
     pointer = interfaceAddresses 
     while pointer != nil { 
      let name : String = String.init(validatingUTF8: pointer!.pointee.ifa_name)! 
      let flags = UInt32((pointer?.pointee.ifa_flags)!)//Int32(pointer?.pointee.ifa_flags) 
      let addr = pointer?.pointee.ifa_addr.pointee 

      if addr?.sa_family == UInt8(AF_LINK) { 
        if name.hasPrefix("en") { 
         networkData = unsafeBitCast(pointer?.pointee.ifa_data, to: UnsafeMutablePointer<if_data>.self) 
         returnTuple.wifi.sent += (networkData?.pointee.ifi_obytes)! 
         returnTuple.wifi.received += (networkData?.pointee.ifi_ibytes)! 
        } else if name.hasPrefix("pdp_ip") { 
         networkData = unsafeBitCast(pointer?.pointee.ifa_data, to: UnsafeMutablePointer<if_data>.self) 
         returnTuple.wwan.sent += (networkData?.pointee.ifi_obytes)! 
         returnTuple.wwan.received += (networkData?.pointee.ifi_ibytes)! 
        } 
       } 

      pointer = pointer?.pointee.ifa_next 
     } 
    } 

    freeifaddrs(interfaceAddresses) 

    return returnTuple 
}