Нажмите, чтобы повторить попытку подключения к Интернету в Swift - PullRequest
0 голосов
/ 28 августа 2018

Я новичок в Swift и пытаюсь предупредить пользователя о повторном подключении к Интернету. Я использую Reachability Эшлимиллс. Я запутался в том, что ставить в моем обработчике оповещений, так как это не работает:

func alertConnect() -> UIViewController{
let reach = Reachability()
let alert = UIAlertController(title: "No Internet", message: "Tap to retry connect internet", preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "Retry", style: .default, handler: {
    action in
    do {
        try reach?.startNotifier()
    } catch {
        print("Unable to start notifier")
    }
}))
alert.addAction(UIAlertAction(title: Constants.cancel, style: .cancel))
return alert
}

Вот мой класс Reachability.class:

class ConnectionManager: NSObject {

var reachability: Reachability!

static let sharedInstance: ConnectionManager = { return ConnectionManager() }()


override init() {
    super.init()

    reachability = Reachability()!

    NotificationCenter.default.addObserver(
        self,
        selector: #selector(networkStatusChanged(_:)),
        name: .reachabilityChanged,
        object: reachability
    )

    do {
        try reachability.startNotifier()
    } catch {
        print("Unable to start notifier")
    }
}

@objc func networkStatusChanged(_ notification: Notification) {
    // Do something globally here!
    do {
        try reachability.startNotifier()
    } catch {
        print("Unable to start notifier")
    }
}

static func stopNotifier() -> Void {
    do {
        try (ConnectionManager.sharedInstance.reachability).startNotifier()
    } catch {
        print("Error stopping notifier")
    }
}

static func isReachable(completed: @escaping (ConnectionManager) -> Void) {
    if (ConnectionManager.sharedInstance.reachability).connection != .none {
        completed(ConnectionManager.sharedInstance)
    }
}

static func isUnreachable(completed: @escaping (ConnectionManager) -> Void) {
    if (ConnectionManager.sharedInstance.reachability).connection == .none {
        completed(ConnectionManager.sharedInstance)
    }
}

static func isReachableViaWWAN(completed: @escaping (ConnectionManager) -> Void) {
    if (ConnectionManager.sharedInstance.reachability).connection == .cellular {
        completed(ConnectionManager.sharedInstance)
    }
}

static func isReachableViaWiFi(completed: @escaping (ConnectionManager) -> Void) {
    if (ConnectionManager.sharedInstance.reachability).connection == .wifi {
        completed(ConnectionManager.sharedInstance)
    }
}    }

Что я должен включить в свой обработчик действий Retry, чтобы позволить пользователю повторно подключиться к Интернету? Спасибо за любую помощь.

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Я нашел решение по моей проблеме. Так как Reachability проверяет, доступно ли приложение, и если есть изменение состояния сети, то, что я сделал на обработчике Retry, объявил функцию на моем контроллере представления, которая снова вызывает API при проверке сетевого соединения.

0 голосов
/ 28 августа 2018

Рабочий код для Swift 4

import SystemConfiguration

func InternetCheck () -> Bool {

    var zeroAddress = sockaddr_in()
    zeroAddress.sin_len = UInt8(MemoryLayout.size(ofValue: zeroAddress))
    zeroAddress.sin_family = sa_family_t(AF_INET)

    let defaultRouteReachability = withUnsafePointer(to: &zeroAddress) {
            $0.withMemoryRebound(to: sockaddr.self, capacity: 1) {zeroSockAddress in
            SCNetworkReachabilityCreateWithAddress(nil, zeroSockAddress)
        }
    }

    var flags = SCNetworkReachabilityFlags()
    if !SCNetworkReachabilityGetFlags(defaultRouteReachability!, &flags) {
        return false
    }
    let isReachable = flags.contains(.reachable)
    let needsConnection = flags.contains(.connectionRequired)
    return (isReachable && !needsConnection)
}

Для проверки

if InternetCheck() == false {

   let alert = UIAlertView(title:"Uhhhh :(",message: "No internet connection.",delegate: nil ,cancelButtonTitle: "Ok")
   alert.show()
   return

}
// Internet Connection Available
...