2014-09-17 1 views
5

Gibt es eine Möglichkeit zum Verfolgen von Mobilfunkdaten, die vom Gerät in swift verwendet werden? Gibt es eine API? Ich versuche, so etwas wie thisVerfolgen der Nutzung von Mobilfunkdaten mithilfe von swift

+1

Check out __ [diese Frage] (http://stackoverflow.com/questions/7946699/iphone-data-usage-tracking-monitoring/8014012#8014012) __. Es ist für Objective - C, aber ich denke, Sie könnten es mit wenig Aufwand ändern, damit es in Swift funktioniert. – aksh1t

Antwort

1

Aktualisiert Swift 4 erreichen Sie diese einfache Erweiterung verwenden können. Um die Gerätezelle und WLAN-Nutzung zu verfolgen.

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 
    } 
} 

Sie können es verwenden, wie: SystemDataUsage.wifiCompelete

+0

Diese Verwendung gilt für das gesamte Gerät oder eine einzelne App –

Verwandte Themen