Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/106.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 使用swift跟踪蜂窝数据使用情况_Ios_Swift_Xcode6 - Fatal编程技术网

Ios 使用swift跟踪蜂窝数据使用情况

Ios 使用swift跟踪蜂窝数据使用情况,ios,swift,xcode6,Ios,Swift,Xcode6,有没有办法跟踪swift中设备使用的手机数据?有api吗?我正在尝试实现类似于更新到Swift 4的功能,您可以使用这个简单的扩展。跟踪设备单元和wifi使用情况 extension SystemDataUsage { public static var wifiCompelete: UInt64 { return SystemDataUsage.getDataUsage().wifiSent + SystemDataUsage.getDataUsage().wifiR

有没有办法跟踪swift中设备使用的手机数据?有api吗?我正在尝试实现类似于更新到Swift 4的功能,您可以使用这个简单的扩展。跟踪设备单元和wifi使用情况

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
    }
}
扩展系统数据用法{
公共静态var接线组件:UInt64{
返回SystemDataUsage.getDataUsage()
}
公共静态变量wwancomplete:UInt64{
返回SystemDataUsage.getDataUsage()
}
}
类SystemDataUsage{
专用静态let wwanInterfacePrefix=“pdp\U ip”
私有静态let wifiInterfacePrefix=“en”
类func getDataUsage()->DataUsageInfo{
var ifaddr:不可女性化的指针?
var dataUsageInfo=dataUsageInfo()
guard getifaddrs(&ifaddr)==0其他{return dataUsageInfo}
而让addr=ifaddr{
guard let info=getDataUsageInfo(from:addr)else{
ifaddr=addr.pointee.ifa\u下一步
持续
}
dataUsageInfo.UpdateInfo通过添加(信息)
ifaddr=addr.pointee.ifa\u下一步
}
FreeIFADRS(ifaddr)
返回dataUsageInfo
}
私有类func getDataUsageInfo(来自infoPointer:UnsafeMutablePointer)->DataUsageInfo{
让指针=infoPointer
let name:String!=String(cString:pointer.pointee.ifa\u name)
设addr=pointer.pointee.ifa_addr.pointee
guard addr.sa_family==UInt8(AF_链接)else{return nil}
返回dataUsageInfo(发件人:指针,名称:名称)
}
私有类func dataUsageInfo(来自指针:UnsafeMutablePointer,名称:String)->dataUsageInfo{
var networkData:不可用指针?
var dataUsageInfo=dataUsageInfo()
if name.hasPrefix(wifiInterfacePrefix){
networkData=unsafeBitCast(pointer.pointee.ifa_data,to:UnsafeMutablePointer.self)
如果let data=networkData{
dataUsageInfo.wifiSent+=UInt64(data.pointee.ifi_obytes)
dataUsageInfo.wifiReceived+=UInt64(data.pointee.ifi_ibytes)
}
}如果name.hasPrefix(WWAN接口前缀),则为else{
networkData=unsafeBitCast(pointer.pointee.ifa_data,to:UnsafeMutablePointer.self)
如果let data=networkData{
dataUsageInfo.WirelessWandaSent+=UInt64(data.pointee.ifi_obytes)
dataUsageInfo.WirelessWandarReceived+=UInt64(data.pointee.ifi_ibytes)
}
}
返回dataUsageInfo
}
}
结构DataUsageInfo{
变量wifiReceived:UInt64=0
变量wifiSent:UInt64=0
var WirelessWandarReceived:UInt64=0
var WirelessWandaSent:UInt64=0
通过添加(info:DataUsageInfo)对func updateInfo进行变异{
wifiSent+=info.wifiSent
wifiReceived+=info.wifiReceived
WirelessWandaSent+=信息。WirelessWandaSent
WirelessWandarReceived+=信息。WirelessWandarReceived
}
}

您可以像这样使用它:
SystemDataUsage.wificomplete

接受答案以字节为单位返回数据。 SystemDataUsage.wificomplete


此信息可能对某人有所帮助。

请查看。它是针对Objective-C的,但我认为您可以通过不费吹灰之力的方式对其进行更改,以使其在Swift中正常工作。但是,您如何知道您在自定义的时间段内使用了多少数据,如本月或从本月25日到下个月25日?此用法适用于整个设备或单个应用谢谢代码!如果可以,请添加注释或解释代码?非常感谢。这将回复执行时设备的总使用量,或仅提供我们的应用程序使用量…???这是针对设备的。如您所见,我们正在访问设备wifi和wwan接口@UsmanNisar