2014-09-17 9 views
5

C'è un modo per tenere traccia dei dati cellulari utilizzati dal dispositivo in swift? C'è qualche api? Sto cercando di ottenere qualcosa come thisMonitora l'utilizzo dei dati cellulari utilizzando swift

+1

Partenza __ [questa domanda] (http://stackoverflow.com/questions/7946699/iphone-data-usage-tracking-monitoring/8014012#8014012) __. È per Objective - C, ma penso che potresti cambiarlo con poco sforzo per farlo funzionare in Swift. – aksh1t

risposta

1

Aggiornato a Swift 4 puoi usare questa semplice estensione. Per monitorare la cella del dispositivo e l'utilizzo del Wi-Fi.

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

Si può usare come: SystemDataUsage.wifiCompelete

+0

questo utilizzo è per dispositivo generale o singola applicazione –

Problemi correlati