Проверка соединения Inte rnet в SWIFT - PullRequest
0 голосов
/ 29 апреля 2020

Какой самый простой способ проверить соединение inte rnet?

Я нашел этот пример кода, но это самый эффективный способ в Xcode11 / Swift5?

Мне нужно только проверить соединение под кнопкой нажмите перед вызовом моей функции, которая загружается из inte rnet. Так что простая проверка перед вызовом моей функции сделает это. Является ли этот постоянный мониторинг наиболее эффективным? Или я должен использовать что-то прямо под моим нажатием кнопки.

import Network

class ViewController: UIViewController {

let monitor = NWPathMonitor()
let queue = DispatchQueue(label: "InternetConnectionMonitor")

override func viewDidLoad() {
    monitor.pathUpdateHandler = { pathUpdateHandler in
        if pathUpdateHandler.status == .satisfied {
            print("Internet connection is on.")
        } else {
            print("There's no internet connection.")
        }
    }

    monitor.start(queue: queue)
}

}

Ответы [ 2 ]

2 голосов
/ 29 апреля 2020

Я использовал для этого структуру Reachability by ashleymills: https://github.com/ashleymills/Reachability.swift

Вам просто нужно импортировать через: import ReachabilitySwift

Тогда просто внутри вашего контроллера представления Вы можете сделать, например:

let reachability = try! Reachability()

if reachability.isReachable {
   print("Internet connection is on.")
}

См. ReadMe репозитория для большего количества примеров того, как использовать замыкания. Помните, что это внешняя структура, которая может не соответствовать последней версии Swift.

0 голосов
/ 29 апреля 2020

import SystemConfiguration:

import SystemConfiguration

до того, как класс viewController добавит этот класс:

public class Reachability {

class func isConnected() -> Bool {

    var noAddress = 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))
    noAddress.sin_len = UInt8(MemoryLayout.size(ofValue: noAddress))
    noAddress.sin_family = sa_family_t(AF_INET)

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

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

    let isReachable = (flags.rawValue & UInt32(kSCNetworkFlagsReachable)) != 0
    let needsConnection = (flags.rawValue & UInt32(kSCNetworkFlagsConnectionRequired)) != 0
    let ret = (isReachable && !needsConnection)

    return ret
}
}

Теперь в viewDidLoad проверьте соединение:

if Reachability.isConnected(){
        print("Internet Connection is ON")
    } else {
        print("Internet Connection OFF")
    }
...