2014-09-17 7 views
5

का उपयोग कर सेलुलर डेटा उपयोग को ट्रैक करें क्या डिवाइस द्वारा उपयोग किए जाने वाले सेलुलर डेटा को ट्रैक करने का कोई तरीका है? क्या कोई एपीआई है? मैं thisस्विफ्ट

+1

बाहर चेक __ [इस सवाल] (http://stackoverflow.com/questions/7946699/iphone-data-usage-tracking-monitoring/8014012#8014012) __। यह उद्देश्य - सी के लिए है, लेकिन मुझे लगता है कि आप इसे स्विफ्ट में काम करने के लिए थोड़ा सा प्रयास कर सकते हैं। – aksh1t

उत्तर

1

स्विफ्ट 4 में अपडेट किया गया है, तो आप इस आसान एक्सटेंशन का उपयोग कर सकते हैं। डिवाइस सेल और वाईफाई उपयोग को ट्रैक करने के लिए।

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

आप इसे पसंद का उपयोग कर सकते हैं: SystemDataUsage.wifiCompelete

+0

यह उपयोग समग्र डिवाइस या एकल ऐप के लिए है –