2016-06-20 1 views
3

в моем приложении. Я проверяю, что если мобильные данные не отображаются, всплывающее окно, например, проверьте подключение к данным. для этого я пишу этот кодКак я могу проверить мобильные данные или Wi-Fi включен или выключен. ios swift

import Foundation 
import SystemConfiguration 

public class Reachability { 

    class func isConnectedToNetwork() -> Bool { 

     var zeroAddress = sockaddr_in(sin_len: 0, sin_family: 0, sin_port: 0, sin_addr: in_addr(s_addr: 0), sin_zero: (0, 0, 0, 0, 0, 0, 0, 0)) 
     zeroAddress.sin_len = UInt8(sizeofValue(zeroAddress)) 
     zeroAddress.sin_family = sa_family_t(AF_INET) 

     let defaultRouteReachability = withUnsafePointer(&zeroAddress) { 
      SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault, UnsafePointer($0)) 
     } 

     var flags: SCNetworkReachabilityFlags = SCNetworkReachabilityFlags(rawValue: 0) 
     if SCNetworkReachabilityGetFlags(defaultRouteReachability!, &flags) == false { 
      return false 
     } 

     let isReachable = flags == .Reachable 
     let needsConnection = flags == .ConnectionRequired 

     return isReachable && !needsConnection 

    } 
} 

, но по этому коду его единственная проверка, что Wi-Fi подключен или нет. но если я попробую с 3g мобильных данных, он всегда показывает мне, что ваши мобильные данные не связаны. так как я могу это решить?

+0

Это работает для меня: [ссылка] (https://github.com/ashleymills/Reachability .swift) – DadoZolic

+0

Работает. в то время как я подключен через Wi-Fi. но он не работает, пока я подключен через мобильные данные @DadoZolic –

ответ

2

Если у вас есть какие-либо супер класса в приложении используйте ниже код

override func viewWillAppear(animated: Bool) 
    { 
     super.viewWillAppear(animated) 


     NSNotificationCenter.defaultCenter().addObserver(self, selector: "ShowNetConnectivity", name: SHOW_NO_INTERNET_CONNECTION, object: nil) 

     NSNotificationCenter.defaultCenter().addObserver(self, selector: "DisssmissConnectivity", name: DISMISS_INTERNET_CONNECTION, object: nil) 


     let reachability = SCNetworkReachabilityCreateWithName(nil, host)! 
     SCNetworkReachabilitySetCallback(reachability, { (_, flags, _) in 
      print(flags.rawValue) 

      if (flags.rawValue == NotReachable.rawValue && flags.rawValue != ReachableViaWiFi.rawValue && flags.rawValue != ReachableViaWWAN.rawValue) 
      { 
       if(isConnectionAvailable == true) 
       { 
        let nc = NSNotificationCenter.defaultCenter() 
        nc.postNotificationName(SHOW_NO_INTERNET_CONNECTION, object: nil) 
       } 
      }else 
      { 
       if(isConnectionAvailable == false) 
       { 
        let nc = NSNotificationCenter.defaultCenter() 
        nc.postNotificationName(DISMISS_INTERNET_CONNECTION, object: nil) 
       } 
      } 

      }, &context) 

     SCNetworkReachabilityScheduleWithRunLoop(reachability, CFRunLoopGetMain(), kCFRunLoopCommonModes) 
    } 

    override func viewWillDisappear(animated: Bool) 
    { 
     super.viewWillDisappear(animated) 
     NSNotificationCenter.defaultCenter().removeObserver(self, name: SHOW_NO_INTERNET_CONNECTION, object: nil) 
     NSNotificationCenter.defaultCenter().removeObserver(self, name: DISMISS_INTERNET_CONNECTION, object: nil) 
    } 
4

Попробуйте, как показано ниже код:

Создать объект класса достижимости, как,

var internetReachability = Reachability() 

Теперь напишите ниже код в видеDidLoad(),

NSNotificationCenter.defaultCenter().addObserver(self, selector: "reachabilityChanged:", name: kReachabilityChangedNotification, object: nil) 
    self.internetReachability = Reachability.reachabilityForInternetConnection() 
    self.internetReachability.startNotifier() 
    self.updateInterfaceWithReachability(self.internetReachability) 

Теперь создадут функцию для проверки reachabilty о Wi-Fi, а также пакете данных,

func updateInterfaceWithReachability(reachability: Reachability) 
{ 
    let netStatus : NetworkStatus = reachability.currentReachabilityStatus() 
    switch (netStatus.rawValue) 
    { 
    case NotReachable.rawValue: 
     print("offline") 
     break 
    case ReachableViaWWAN.rawValue: 
     print("online") 
     break 
    case ReachableViaWiFi.rawValue: 
     print("online") 
     break 
    default : 
     print("offline") 
     break 
    } 
} 

// Rechability update status 
func reachabilityChanged(sender : NSNotification!) 
{ 
    let curReach : Reachability = sender.object as! Reachability 
    self.updateInterfaceWithReachability(curReach) 
} 

Надеется, что это поможет.

+0

должен ли я использовать тот же класс Reachability()? –

+0

Да. У вас есть эта библиотека? –

+0

Нет, я использую его, создавая общедоступный класс –

1

Вот как я это делаю, и это работает для меня. В моей viewDidLoad:

do { 
     reachability = try Reachability.reachabilityForInternetConnection() 
    } catch { 
     print("Unable to create Reachability") 
     return 
    } 

    NSNotificationCenter.defaultCenter().addObserver(self, 
                selector: #selector(MainViewController.reachabilityChanged(_:)), 
                name: ReachabilityChangedNotification, 
                object: reachability) 

    do { 
     try reachability.startNotifier() 
    } catch { 
     print("This is not working.") 
     return 
    } 

И reachabilityChanged

func reachabilityChanged(note: NSNotification) { 

    let reachability = note.object as! Reachability 

    if reachability.isReachable() { 
     if reachability.isReachableViaWiFi() { 
      print("Reachable via WiFi") 
     } else { 
      print("Reachable via Cellular") 
     } 
    } else { 
     showNoConnectionAlert() 
     print("Not reachable") 
    } 
} 

Используя этот Reachability

Смежные вопросы