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