Reachability (проверка подключения к сети)

reachability
connection
snippet

#1

Часто нужно проверить коннект к сети, иначе можно забыться и заставить приложение упасть…

Я много вариантов использовал, но этот самый корректный

import SystemConfiguration

class Reachability {
    class func isConnectedToNetwork() -> Bool {
        var zeroAddress = sockaddr_in()
        zeroAddress.sin_len = UInt8(sizeofValue(zeroAddress))
        zeroAddress.sin_family = sa_family_t(AF_INET)
        guard let defaultRouteReachability = withUnsafePointer(&zeroAddress, {
            SCNetworkReachabilityCreateWithAddress(nil, UnsafePointer($0))
        }) else {return false}
        var flags : SCNetworkReachabilityFlags = []
        if !SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags) {return false}
        let isReachable = flags.contains(.Reachable)
        let needsConnection = flags.contains(.ConnectionRequired)
        return (isReachable && !needsConnection)
    } // isConnectedToNetwork
} // class Reachabilit`

Проверять можно так:

if Reachability.isConnectedToNetwork() == true {
    print("Internet connection OK")
 } else {
    print("Internet connection FAILED")
 }

#2

Сейчас нет возможности на всем протестить, а это будет работать на 3g и 4g?, а то я использовал похожий код из интернета, все в симуляторе и на устройстве работало от домашнего вайфая, а приложение выпустил в appStore и тут оказалось что код не работает(


#3

Проверил во всех режимах(3g 4g wifi), все работает) Спасибо!)


#4

Да не за что! У меня тоже проблема была с сетью, я почему и искал более рабочее решение, может кому и пригодится. Я в xcode создал сниппет для быстрого вызова метода, можно очень быстро вставлять и использовать


#5

А можно как-нибудь сделать, чтобы он постоянно следил за состоянием подключения и если обрубится интернет, то сразу же вывел алерт? А то у меня пока единственная мысль, так сделать это через NSTimer


#6

Для Swift 3:

import SystemConfiguration
 
 
class Reachability {
    class func isConnectedToNetwork() -> Bool {
        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) {
                zeroSockAddress in SCNetworkReachabilityCreateWithAddress(nil, zeroSockAddress)}
        } ) else {
            return false
        }
        var flags : SCNetworkReachabilityFlags = []
        if !SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags) {return false}
        let isReachable = flags.contains(.reachable)
        let needsConnection = flags.contains(.connectionRequired)
        return (isReachable && !needsConnection)
    } // isConnectedToNetwork
} // class Reachabilit`

Проверочка та же:

 if Reachability.isConnectedToNetwork() == true {
     print("Internet connection OK")
  } else {
     print("Internet connection FAILED")
 }

#7

Не один способ не работает с сетями московского метро и наземного транспорта: MT Free
До нажатия кнопки «войти в интернет» перевдресовывает на страницу : http://auth.wi-fi.ru
Ну вот, до нажатия этой кнопки по сути инета нет и ни один способ не попался который показывал отсутствия интернет подключения…
Кто подскажет решение?
Ps в приложении авито московское метро успешно детектиться


#8

Подозреваю, что у Авито просто договор с мосметро. Интернет то есть на тот момент, просто нужно пройти авторизацию. Ну вы можете просто попробовать дополнительно загрузить сайт apple.com. Если не прогрузился, то инета с авторизацией нет


#9

в чем-то вы правы. Если нажать на рекламу, то реклама грузиться на стороннем домене без авторизации. Инет есть.
Сейчас копаю в сторону возвращаемого http status code. Скорей всего в метро он будет другой (поскольку стоит редирект).
По умолчанию при наличие интернета statusCode = 200