Is there any way to track cellular data used by device in swift? Is there any api? I am trying to achieve something like this
Asked
Active
Viewed 7,444 times
12
-
1Check out __[this question](http://stackoverflow.com/questions/7946699/iphone-data-usage-tracking-monitoring/8014012#8014012)__. It is for Objective - C, but I think you could change it with little effort to make it work in Swift. – aksh1t Sep 17 '14 at 11:36
-
But how can you know how much data have you used in a custom period of time, like the current month or from 25th till 25th next month? – Slavcho Oct 04 '18 at 12:10
2 Answers
15
Updated to Swift 4 you can use this easy extension. To track the device cell and wifi Usage.
extension SystemDataUsage {
public static var wifiCompelete: UInt64 {
return SystemDataUsage.getDataUsage().wifiSent + SystemDataUsage.getDataUsage().wifiReceived
}
public static var wwanCompelete: UInt64 {
return SystemDataUsage.getDataUsage().wirelessWanDataSent + SystemDataUsage.getDataUsage().wirelessWanDataReceived
}
}
class SystemDataUsage {
private static let wwanInterfacePrefix = "pdp_ip"
private static let wifiInterfacePrefix = "en"
class func getDataUsage() -> DataUsageInfo {
var ifaddr: UnsafeMutablePointer<ifaddrs>?
var dataUsageInfo = DataUsageInfo()
guard getifaddrs(&ifaddr) == 0 else { return dataUsageInfo }
while let addr = ifaddr {
guard let info = getDataUsageInfo(from: addr) else {
ifaddr = addr.pointee.ifa_next
continue
}
dataUsageInfo.updateInfoByAdding(info)
ifaddr = addr.pointee.ifa_next
}
freeifaddrs(ifaddr)
return dataUsageInfo
}
private class func getDataUsageInfo(from infoPointer: UnsafeMutablePointer<ifaddrs>) -> DataUsageInfo? {
let pointer = infoPointer
let name: String! = String(cString: pointer.pointee.ifa_name)
let addr = pointer.pointee.ifa_addr.pointee
guard addr.sa_family == UInt8(AF_LINK) else { return nil }
return dataUsageInfo(from: pointer, name: name)
}
private class func dataUsageInfo(from pointer: UnsafeMutablePointer<ifaddrs>, name: String) -> DataUsageInfo {
var networkData: UnsafeMutablePointer<if_data>?
var dataUsageInfo = DataUsageInfo()
if name.hasPrefix(wifiInterfacePrefix) {
networkData = unsafeBitCast(pointer.pointee.ifa_data, to: UnsafeMutablePointer<if_data>.self)
if let data = networkData {
dataUsageInfo.wifiSent += UInt64(data.pointee.ifi_obytes)
dataUsageInfo.wifiReceived += UInt64(data.pointee.ifi_ibytes)
}
} else if name.hasPrefix(wwanInterfacePrefix) {
networkData = unsafeBitCast(pointer.pointee.ifa_data, to: UnsafeMutablePointer<if_data>.self)
if let data = networkData {
dataUsageInfo.wirelessWanDataSent += UInt64(data.pointee.ifi_obytes)
dataUsageInfo.wirelessWanDataReceived += UInt64(data.pointee.ifi_ibytes)
}
}
return dataUsageInfo
}
}
struct DataUsageInfo {
var wifiReceived: UInt64 = 0
var wifiSent: UInt64 = 0
var wirelessWanDataReceived: UInt64 = 0
var wirelessWanDataSent: UInt64 = 0
mutating func updateInfoByAdding(_ info: DataUsageInfo) {
wifiSent += info.wifiSent
wifiReceived += info.wifiReceived
wirelessWanDataSent += info.wirelessWanDataSent
wirelessWanDataReceived += info.wirelessWanDataReceived
}
}
You can use it like: SystemDataUsage.wifiCompelete

BilalReffas
- 8,132
- 4
- 50
- 71
-
3
-
Thanks for the code! If you can, would you please add comments or explain your code? Thank you! – Microbob Oct 29 '18 at 15:52
-
this will reply total usage of device at time of execution or only provide our app usage...????? – Hardik Vyas Jan 11 '20 at 10:12
-
It's for the device. As you see we accessing the device wifi and wwan interface @UsmanNisar – BilalReffas Jun 09 '20 at 10:14
-
2
Accepted answer returns data in Bytes. SystemDataUsage.wifiCompelete
This information could be helpful for someone.

Vishwas Singh
- 1,497
- 1
- 18
- 16