跟踪iPhone数据使用情况

有人可以帮我我怎么能从WWAN和WLAN使用Swift的数据使用?

我发现堆栈溢出如何在Objective-C中做到这一点,但解释会很好!

Objective-C中是如何做到这一点的 。

这是一个可能的实现。

首先,在Objective-C桥接头文件中包含ifaddrs

 #include <ifaddrs.h> 

然后,尝试这个function:

 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 } 

它返回嵌套的Swift元组,代表您请求的四条数据。 这使得访问变得容易。 例如:

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

更新@Aaron Brager回答Swift 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 }