有人可以帮助我如何使用Swift从WWAN和WLAN获取数据使用情况吗?跟踪iPhone的数据使用情况
我发现堆栈溢出如何在Objective-C中做到这一点,但解释会很好!
Here is how to do that in Objective-C。
有人可以帮助我如何使用Swift从WWAN和WLAN获取数据使用情况吗?跟踪iPhone的数据使用情况
我发现堆栈溢出如何在Objective-C中做到这一点,但解释会很好!
Here is how to do that in Objective-C。
这里有一个可能的实现。
首先,在您的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)"
谢谢我检查:)所以我真的在IOS开发新的,所以它会帮助我很多! – BilalReffas 2015-04-06 00:38:55
函数只返回0的数据使用?:( – BilalReffas 2015-04-06 01:01:59
@BilalReffas它为我工作,你如何运行它? – 2015-04-06 01:24:38
更新@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
}
你尝试改写自己的方法?这是一个有趣的练习。 – 2015-04-06 00:06:28
所以它很复杂? – BilalReffas 2015-04-06 00:07:47