Проверить статус сети в 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)
}
}
}