Проверить статус сети в Swift

Как проверить статус сети в Swift? В файлах Objective-C Reachability.h.m были доступны. Что теперь? Как я могу проверить, являюсь ли я онлайн или офлайн?

Ответы

Ответ 1

Вы все еще можете использовать Reachability в Swift. Логан имеет хороший ответ о том, как добавить objective-c файлы в заголовок здесь. После настройки заголовка моста вы можете вызвать методы Reachability из вашего кода Swift. Что-то вроде этого будет работать:

class func hasConnectivity() -> Bool {
    let reachability: Reachability = Reachability.reachabilityForInternetConnection()
    let networkStatus: Int = reachability.currentReachabilityStatus().value
    return networkStatus != 0
}

Ответ 2

Если вы ищете быструю реализацию класса Apple Reachability, вы можете взглянуть на это:

http://github.com/ashleymills/Reachability.swift

Это падение класса, используя уведомления и.

Ответ 3

Я дам лучшее решение, надеюсь, что он будет полезен.

import Foundation
import SystemConfiguration

public class Reachability {
    class func isConnectedToNetwork()->Bool{

        var Status:Bool = false
        let url = NSURL(string: "http://google.com/")
        let request = NSMutableURLRequest(URL: url!)
        request.HTTPMethod = "HEAD"
        request.cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringLocalAndRemoteCacheData
        request.timeoutInterval = 10.0

        var response: NSURLResponse?

        var data = NSURLConnection.sendSynchronousRequest(request, returningResponse: &response, error: nil) as NSData?

        if let httpResponse = response as? NSHTTPURLResponse {
            if httpResponse.statusCode == 200 {
                Status = true
            }

        }
        else
        {

            let alert = UIAlertView(title: "No Internet Connection", message: "Make sure your device is connected to the internet.", delegate: nil, cancelButtonTitle: "OK")
            alert.show()
        }

        return Status
    }
}

Как получить доступ или вызвать в других классах:

 if Reachability.isConnectedToNetwork() == true {

// write your code

}

Ответ 4

Сначала добавьте файл Reachability.swift в свой проект, который вы можете получить здесь ниже.

https://github.com/pavangandhi/TestProject/tree/master/TestProject/AppConstants

Использование приведенного ниже кода для тестирования приложения связано с Интернетом или нет:

//проверить подключение к Интернету, если его возвращает ДА ​​означает его соединение с Интернетом, Wi-Fi и сотовыми данными

class func isConnectedToNetwork() -> Bool 
{
    let reachability = Reachability.reachabilityForInternetConnection()

    if reachability.isReachable() || reachability.isReachableViaWiFi() || reachability.isReachableViaWWAN()
    {
        return true
    }
    else
    {
        return false
    }
}

Примечание. Перед добавлением этого кода необходимо добавить файл Reachability.swift в свой проект.

Ответ 5

Я успешно использовал код эту статью. Хотя после выпуска моего приложения я понял, что google.com заблокирован в Китае, и этот код испорчен в странах, где Google заблокирован. Поэтому я скорректировал его, чтобы проверить второй URL-адрес, если первый не удался. Если второй удастся, я сохраню его как предпочтительный URL.

Изменить: Пока следующий код остается в силе, после его использования в дикой природе я заметил, что тестирование сети путем загрузки URL-адреса может привести к недопустимым задержкам, когда пользователь подключен к слабому (не -4G) сотовой связи. Теперь я использую класс Reachability, как это было предложено @Ashley Mills выше.

public class Network {

class func isConnectedToNetwork() -> Bool{
    let defaults = NSUserDefaults.standardUserDefaults()

    var networkStatus:Bool = false
    let urlA = NSURL(string: "http://google.com/")
    let urlB = NSURL(string: "http://baidu.com/")

    let urlDict:[String:NSURL] = ["A":urlA!, "B":urlB!]

    var preference = "A"

    if let temp = defaults.stringForKey("preferredNetworkURL") {
        preference = temp //check the last successful URL or A by default
    } else {
        defaults.setObject(preference, forKey: "preferredNetworkURL")
    }

    networkStatus = Network.fetchURL(urlDict[preference]!, pref:preference)

    if networkStatus == false {
        //check the URL which hasn't been checked
        if preference == "A" {
            preference = "B"
        } else {
            preference = "A"
        }
        networkStatus = Network.fetchURL(urlDict[preference]!, pref:preference)
        println("NETWORK STATUS: \(networkStatus)")
        //if preference "B" returns true, then Baidu.com is available and user is likely in a country where Google is blocked
    }

    return networkStatus
}

class func fetchURL(url:NSURL, pref:String) -> Bool {
    println("URL PREFERENCE: \(pref)")
    let defaults = NSUserDefaults.standardUserDefaults()
    let request = NSMutableURLRequest(URL: url)
    request.HTTPMethod = "HEAD"
    request.cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringLocalAndRemoteCacheData
    request.timeoutInterval = 10.0

    var response: NSURLResponse?

    var data = NSURLConnection.sendSynchronousRequest(request, returningResponse: &response, error: nil) as NSData?

    if let httpResponse = response as? NSHTTPURLResponse {
        if httpResponse.statusCode == 200 {
            defaults.setObject(pref, forKey: "preferredNetworkURL") //remember the URL that succeeded and check it first next time
            return true
        } else {
            return false
        }
    } else {
        return false
    }
}

}

Тогда где-нибудь мне нужно проверить сетевое соединение, которое я вызываю:

if Network.isConnectedToNetwork() == true {
    //perform network dependent actions
} else {
    var alert = UIAlertView(title: "Network Unavailable", message: "Please connect to the internet in order to proceed.", delegate: self, cancelButtonTitle: "OK")
    alert.show()
}

Ответ 6

Проверка доступности интернет-соединения в (iOS) Xcode 7.2, Swift 2.0

Это простой способ проверки доступности сети. Мне удалось перевести его в Swift 2.0, а здесь - окончательный код. Существующий класс Apple Reachability и другие сторонние библиотеки казались слишком сложными для перевода на Swift. Это работает как для 3G, так и для Wi-Fi-соединений. Не забудьте добавить "SystemConfiguration.framework" в свою сеть.

 //Create new swift class file Reachability in your project.

 import SystemConfiguration


 public class InternetReachability {

  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(nil, UnsafePointer($0)).takeRetainedValue()
        }

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

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

       return isReachable && !needsConnection
  }

  }

// Check network connectivity from anywhere in project by using this code.

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

Ответ 7

@blwinters Я переписал этот код, чтобы работать с закрытием и работать в последней версии swift.

import AVFoundation
public class Network {

    class func isConnectedToNetwork(resultHandler: (isTrue: Bool) -> Void) {
        let defaults = NSUserDefaults.standardUserDefaults()

        let urlA = NSURL(string: "http://google.com/")
        let urlB = NSURL(string: "http://baidu.com/")

        let urlDict:[String:NSURL] = ["A":urlA!, "B":urlB!]

        var preference = "A"

        if let temp = defaults.stringForKey("preferredNetworkURL") {
            preference = temp //check the last successful URL or A by default
        } else {
            defaults.setObject(preference, forKey: "preferredNetworkURL")
        }

        Network.fetchURL(urlDict[preference]!, pref:preference) {
            isTrue in
            if isTrue == true {
                print("NETWORK STATUS: \(isTrue)")
                resultHandler(isTrue: isTrue)
            } else {
                //check the URL which hasn't been checked
                if preference == "A" {
                    preference = "B"
                } else {
                    preference = "A"
                }
                Network.fetchURL(urlDict[preference]!, pref:preference) {
                    isTrue in
                    print("NETWORK STATUS: \(isTrue)")
                    resultHandler(isTrue: isTrue)
                }
                //if preference "B" returns true, then Baidu.com is available and user is likely in a country where Google is blocked
            }
        }
    }

    class func fetchURL(url:NSURL, pref:String, resultHandler: (isTrue: Bool) -> Void) {
        print("URL PREFERENCE: \(pref)")
        let defaults = NSUserDefaults.standardUserDefaults()
        let request = NSMutableURLRequest(URL: url)
        request.HTTPMethod = "HEAD"
        request.cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringLocalAndRemoteCacheData
        request.timeoutInterval = 10.0

        var returnBool = false
        let session = NSURLSession(configuration: .defaultSessionConfiguration())
        let dataTask = session.dataTaskWithRequest(request) {
            (let data, let response, let error) in
            if let httpResponse = response as? NSHTTPURLResponse {
                if httpResponse.statusCode == 200 {
                    defaults.setObject(pref, forKey: "preferredNetworkURL") //remember the URL that succeeded and check it first next time
                    returnBool = true
                    resultHandler(isTrue: returnBool)
                } else {
                    returnBool = false
                    resultHandler(isTrue: returnBool)
                }
            } else {
                returnBool = false
                resultHandler(isTrue: returnBool)
            }
        }
        dataTask.resume()
    }
}

Затем вы используете его так

    Network.isConnectedToNetwork(){
        isConnected in
        if isConnected == true {
            dispatch_async(dispatch_get_main_queue()) {
                    //perform network dependent actions
                    //can remove the dispatch async if non UI actions
            }
        } else {
            dispatch_async(dispatch_get_main_queue()) {
                let alertController = UIAlertController(title: "Network Unavailable", message: "Please connect to the internet in order to proceed.", preferredStyle: UIAlertControllerStyle.Alert)
                alertController.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Default,handler: nil))
                self.presentViewController(alertController, animated: true, completion: nil)
            }
        }
    }