有人可以幫助我如何使用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