Guest User

Untitled

a guest
Feb 24th, 2018
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.67 KB | None | 0 0
  1. //
  2. // Reachability.swift
  3. //
  4. // Created by Amr Salman on 4/4/17.
  5. //
  6. //
  7. import Foundation
  8. import SystemConfiguration
  9. import UIKit
  10. import SystemConfiguration.CaptiveNetwork
  11.  
  12. public let ReachabilityStatusChangedNotification = "ReachabilityStatusChangedNotification"
  13.  
  14. public enum ReachabilityType: CustomStringConvertible {
  15. case WWAN
  16. case WiFi
  17.  
  18. public var description: String {
  19. switch self {
  20. case .WWAN: return "WWAN"
  21. case .WiFi: return "WiFi"
  22. }
  23. }
  24. }
  25.  
  26. public enum ReachabilityStatus: CustomStringConvertible {
  27. case Offline
  28. case Online(ReachabilityType)
  29. case Unknown
  30.  
  31. public var description: String {
  32. switch self {
  33. case .Offline: return "Offline"
  34. case .Online(let type): return "Online (\(type))"
  35. case .Unknown: return "Unknown"
  36. }
  37. }
  38. }
  39.  
  40. public class Reachability {
  41.  
  42. public init() { }
  43.  
  44. public func connectionStatus() -> ReachabilityStatus {
  45. var zeroAddress = sockaddr_in()
  46. zeroAddress.sin_len = UInt8(MemoryLayout.size(ofValue: zeroAddress))
  47. zeroAddress.sin_family = sa_family_t(AF_INET)
  48.  
  49. guard let defaultRouteReachability = (withUnsafePointer(to: &zeroAddress) {
  50. $0.withMemoryRebound(to: sockaddr.self, capacity: 1) { zeroSockAddress in
  51. SCNetworkReachabilityCreateWithAddress(nil, zeroSockAddress)
  52. }
  53. }) else {
  54. return .Unknown
  55. }
  56.  
  57. var flags : SCNetworkReachabilityFlags = []
  58. if !SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags) {
  59. return .Unknown
  60. }
  61.  
  62. return ReachabilityStatus(reachabilityFlags: flags)
  63. }
  64.  
  65. public func monitorReachabilityChanges() {
  66. let host = "google.com"
  67. var context = SCNetworkReachabilityContext(version: 0, info: nil, retain: nil, release: nil, copyDescription: nil)
  68. let reachability = SCNetworkReachabilityCreateWithName(nil, host)!
  69.  
  70. SCNetworkReachabilitySetCallback(reachability, { (_, flags, _) in
  71. let status = ReachabilityStatus(reachabilityFlags: flags)
  72.  
  73. NotificationCenter.default.post(name: NSNotification.Name(rawValue: ReachabilityStatusChangedNotification), object: nil, userInfo: ["Status": status.description])}, &context)
  74.  
  75. SCNetworkReachabilityScheduleWithRunLoop(reachability, CFRunLoopGetMain(), CFRunLoopMode.commonModes.rawValue)
  76. }
  77. }
  78.  
  79. extension ReachabilityStatus {
  80.  
  81. public init(reachabilityFlags flags: SCNetworkReachabilityFlags) {
  82. let connectionRequired = flags.contains(.connectionRequired)
  83. let isReachable = flags.contains(.reachable)
  84. let isWWAN = flags.contains(.isWWAN)
  85.  
  86. if !connectionRequired && isReachable {
  87. if isWWAN {
  88. self = .Online(.WWAN)
  89. } else {
  90. self = .Online(.WiFi)
  91. }
  92. } else {
  93. self = .Offline
  94. }
  95. }
  96. }
Add Comment
Please, Sign In to add comment