Hello I am trying to to track phone data usage (both Wi-Fi and Cellular). I am using the following code to get device data usage https://stackoverflow.com/questions/25888272/track-cellular-data-usage-using-swift as I understand it is the only way to get it without having to use private API's.
The problem is I can't figure out why the usage seems to be high compared to other apps that track data usage. I was wondering if anyone could provide documentation on the interfaces used on the code from stack overflow or how to get access to more detailed data usage.
What I am doing with the code from stack overflow is take the total Wi-Fi and cellular usage and compare it with the new one every 15 minutes to store a data usage event.
public func calculateTempDataUsageEvent() -> Void {
let totalWifiDataUsage = Int64(wifiNetworkInfo.getWifiDataUsage())
let totalCellularDataUsage = Int64(cellularNetworkInfo.getCellularDataUsage())
let firstTimestamp = Date().millisecondsSince1970
let tempDataUsageEvent : TempDataUsageEvent
let phoneDataUsage : PhoneDataUsage
let realm = try! Realm()
//Check if realm for PhoneDataUsage is empty, if this is the case store initial phone data usage so we can keep track of it's changes
if(realm.objects(PhoneDataUsage.self).isEmpty) {
phoneDataUsage = PhoneDataUsage(timestamp: firstTimestamp, offsetMinutes: Int32(TimeZone.current.secondsFromGMT() * 1000), totalCellularDataUsage: totalCellularDataUsage, totalWifiDataUsage: totalWifiDataUsage)
do {
try realm.write {
realm.add(phoneDataUsage)
print("Stored Phone Data Usage in Realm")
}
} catch let error as NSError {
print("Failed to store Phone Data Usage in Realm with \(error)")
}
return
} else {
//TODO: Handle this unwrap in a better way
let lastPhoneDataUsage : PhoneDataUsage = getLastPhoneDataUsage()!
let tempEndTimestamp : Int64 = Date().millisecondsSince1970
let tempEventDuration : Int32 = Int32(tempEndTimestamp - lastPhoneDataUsage.timestamp)
let tempOffsetMinutes : Int32 = Int32(TimeZone.current.secondsFromGMT() * 1000)
//Handle phone restart
//TODO: maybe need to know phone uptime possible issue time zone change? https://developer.apple.com/forums/thread/101874
var tempEventWifiDataUsage : Int64
var tempEventCellularDataUsage : Int64
if(totalWifiDataUsage < lastPhoneDataUsage.totalWifiDataUsage || totalCellularDataUsage < lastPhoneDataUsage.totalCellularDataUsage) {
if(totalWifiDataUsage < lastPhoneDataUsage.totalWifiDataUsage) {
tempEventWifiDataUsage = totalWifiDataUsage
} else {
tempEventWifiDataUsage = totalWifiDataUsage - lastPhoneDataUsage.totalWifiDataUsage
}
if(totalCellularDataUsage < lastPhoneDataUsage.totalCellularDataUsage) {
tempEventCellularDataUsage = totalCellularDataUsage
} else {
tempEventCellularDataUsage = totalCellularDataUsage - lastPhoneDataUsage.totalCellularDataUsage
}
phoneDataUsage = PhoneDataUsage(timestamp: tempEndTimestamp, offsetMinutes: tempOffsetMinutes, totalCellularDataUsage: totalCellularDataUsage, totalWifiDataUsage: totalWifiDataUsage)
tempDataUsageEvent = TempDataUsageEvent(startTimestamp: lastPhoneDataUsage.timestamp, endTimestamp: tempEndTimestamp, offsetMinutes: tempOffsetMinutes, eventDuration: tempEventDuration, eventCellularDataUsage: tempEventCellularDataUsage, eventWifiDataUsage: tempEventWifiDataUsage, sendToBackend: true)
} else {
//Default case where phone has not rebooted and API not reset
tempEventWifiDataUsage = totalWifiDataUsage - lastPhoneDataUsage.totalWifiDataUsage
tempEventCellularDataUsage = totalCellularDataUsage - lastPhoneDataUsage.totalCellularDataUsage
phoneDataUsage = PhoneDataUsage(timestamp: tempEndTimestamp, offsetMinutes: tempOffsetMinutes, totalCellularDataUsage: totalCellularDataUsage, totalWifiDataUsage: totalWifiDataUsage)
tempDataUsageEvent = TempDataUsageEvent(startTimestamp: lastPhoneDataUsage.timestamp, endTimestamp: tempEndTimestamp, offsetMinutes: tempOffsetMinutes, eventDuration: tempEventDuration, eventCellularDataUsage: tempEventCellularDataUsage, eventWifiDataUsage: tempEventWifiDataUsage, sendToBackend: true)
}
}
//Write to Realm
do {
try realm.write {
realm.add(tempDataUsageEvent)
realm.add(phoneDataUsage)
print("Stored Temp Data Usage event in Realm")
}
} catch let error as NSError {
print("Failed to store Temp Data Usage event in Realm with \(error)")
}
I called temporal data usage as I then use a 'legacy' table to store all usage and temporal data usage is deleted. I do this to know what is not on backend. Finally I add the values from the events and sum them to show data usage.
public func getTempDataUsageEventSum() -> (wifiDataUsageSum : Int64, cellularDataUsageSum: Int64) {
/**
Returns Wi-Fi/Cell total data usage from TempDataUsageEvent Realm, 0 if empty
*/
let realm = try! Realm()
let totalTempWifiDataUsage: Int64 = realm.objects(TempDataUsageEvent.self).sum(ofProperty: "eventWifiDataUsage")
let totalTempCellularDataUsage : Int64 = realm.objects(TempDataUsageEvent.self).sum(ofProperty: "eventCellularDataUsage")
return (totalTempWifiDataUsage, totalTempCellularDataUsage)
}
Selecting any option will automatically load the page