82 lines
3.3 KiB
Swift
82 lines
3.3 KiB
Swift
import Foundation
|
|
import SystemConfiguration
|
|
|
|
public func connectedToNetwork() {
|
|
|
|
var zeroAddress = sockaddr_in()
|
|
zeroAddress.sin_len = UInt8(MemoryLayout.size(ofValue: zeroAddress))
|
|
zeroAddress.sin_family = sa_family_t(AF_INET)
|
|
|
|
guard let defaultRouteReachability = withUnsafePointer(to: &zeroAddress, {
|
|
$0.withMemoryRebound(to: sockaddr.self, capacity: 1) {
|
|
SCNetworkReachabilityCreateWithAddress(nil, $0)
|
|
}
|
|
}) else {
|
|
print("Network Unreachable - Zero Address")
|
|
return
|
|
}
|
|
|
|
var flags: SCNetworkReachabilityFlags = []
|
|
if !SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags) {
|
|
print("Network Unreachable - Check Flags")
|
|
return
|
|
}
|
|
|
|
let isReachable = flags.contains(.reachable)
|
|
let needsConnection = flags.contains(.connectionRequired)
|
|
connectedSpeed().testDownloadSpeedWithTimeout(5.0) { (megabytesPerSecond, error) in
|
|
if error == nil && isReachable && !needsConnection {
|
|
if let speed = megabytesPerSecond, speed >= 0.05 {
|
|
print("\n | Connected |")
|
|
print("=======Network Speed=======\nMBps: \(speed)\nerror: \(String(describing: error))\n=======-------------=======\n")
|
|
} else {
|
|
print("\n ? Connected ?")
|
|
print("*======| WEAK SIGNAL |======*\nMBps: \(String(describing: megabytesPerSecond))\nerror: \(String(describing: error))\n*=======-------------=======*\n")
|
|
}
|
|
} else {
|
|
print("NETWORK ERROR: \(String(describing: error))")
|
|
}
|
|
}
|
|
}
|
|
|
|
public class connectedSpeed: NSObject, URLSessionDelegate, URLSessionDataDelegate {
|
|
|
|
var startTime: CFAbsoluteTime!
|
|
var stopTime: CFAbsoluteTime!
|
|
var bytesReceived: Int!
|
|
var speedTestCompletionHandler: ((Double?, Error?) -> Void)!
|
|
|
|
public func testDownloadSpeedWithTimeout(_ timeout: TimeInterval, completionHandler: @escaping (Double?, Error?) -> Void) {
|
|
guard let url = URL(string: "https://wokaland.com/") else {
|
|
completionHandler(nil, NSError(domain: "Invalid URL", code: -1, userInfo: nil))
|
|
return
|
|
}
|
|
|
|
startTime = CFAbsoluteTimeGetCurrent()
|
|
stopTime = startTime
|
|
bytesReceived = 0
|
|
speedTestCompletionHandler = completionHandler
|
|
|
|
let configuration = URLSessionConfiguration.ephemeral
|
|
configuration.timeoutIntervalForResource = timeout
|
|
let session = URLSession(configuration: configuration, delegate: self, delegateQueue: nil)
|
|
session.dataTask(with: url).resume()
|
|
}
|
|
|
|
public func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data) {
|
|
bytesReceived += data.count
|
|
stopTime = CFAbsoluteTimeGetCurrent()
|
|
}
|
|
|
|
public func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) {
|
|
let elapsed = stopTime - startTime
|
|
guard elapsed != 0 && (error == nil || (error as NSError?)?.domain == NSURLErrorDomain && (error as NSError?)?.code == NSURLErrorTimedOut) else {
|
|
speedTestCompletionHandler(nil, error)
|
|
return
|
|
}
|
|
|
|
let speed = elapsed != 0 ? Double(bytesReceived) / elapsed / 1024.0 / 1024.0 : -1
|
|
speedTestCompletionHandler(speed, nil)
|
|
}
|
|
}
|