Kiedy próbuję sprawdzić połączenie internetowe na moim iPhonie, pojawia się mnóstwo błędów. Czy ktoś może mi pomóc to naprawić?
Kod:
import Foundation
import SystemConfiguration
public class Reachability {
class func isConnectedToNetwork() -> Bool {
var zeroAddress = sockaddr_in()
zeroAddress.sin_len = UInt8(sizeofValue(zeroAddress))
zeroAddress.sin_family = sa_family_t(AF_INET)
let defaultRouteReachability = withUnsafePointer(&zeroAddress) {
SCNetworkReachabilityCreateWithAddress(nil, UnsafePointer($0))
}
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) ? true : false
}
}
Błędy w kodzie:
Jeśli jest nieczytelny, błąd 1 mówi:
„Int” nie jest konwertowany na „SCNetworkReachabilityFlags”
Błąd 2 i 3:
Nie można znaleźć przeciążenia dla parametru „init”, które akceptuje podane argumenty
ios
swift
xcode
reachability
b3rge
źródło
źródło
Odpowiedzi:
Aby rozwiązać problem 4G wymieniony w komentarzach, wykorzystałem implementację osiągalności @AshleyMills jako odniesienie i przepisałem Reachability for Swift 3.1:
zaktualizowano: Xcode 10.1 • Swift 4 lub nowszy
Plik Reachability.swift
Stosowanie
Zainicjuj go w metodzie AppDelegate.swift didFinishLaunchingWithOptions i obsłuż wszystkie ewentualne błędy:
I przykład kontrolera widoku:
Przykładowy projekt
źródło
if SCNetworkReachabilityGetFlags(…)
ponieważ xCode zwraca Bool w jego najnowszej wersji.W przypadku Swift 3, Swift 4 (współpracujący z siecią komórkową i Wi-Fi):
Stosowanie:
źródło
Utwórz nowy plik Swift w swoim projekcie, nazwij go
Reachability.swift
. Wytnij i wklej do niego poniższy kod, aby utworzyć klasę.Możesz sprawdzić połączenie internetowe w dowolnym miejscu swojego projektu, używając tego kodu:
Jeśli użytkownik nie jest podłączony do Internetu, możesz wyświetlić mu okno dialogowe z ostrzeżeniem, aby je powiadomić.
Wyjaśnienie:
Tworzymy klasę publiczną wielokrotnego użytku i metodę, której można użyć w dowolnym miejscu projektu, aby sprawdzić łączność z Internetem. Wymagamy dodania ram Foundation i System Configuration.
W klasie publicznej Reachability metoda
isConnectedToNetwork() -> Bool { }
zwróci wartość bool dotyczącą łączności internetowej. Używamy pętli if, aby wykonać wymagane działania na obudowie. Mam nadzieję, że to wystarczy. Twoje zdrowie!źródło
Jeśli ktoś już korzysta z Alamofire, to -
Stosowanie:
źródło
Sprawdziłem wdrożenie klasy osiągalności Ashley Mill bez Cocoa Pods / Dependancy Manager. Chodzi o to, aby zależność od osiągalności była wolna w projekcie.
Xcode 7.2 - Swift 2.1
1) https://github.com/ashleymills/Reachability.swift . Pobierz dodaj klasę osiągalności do projektu.
Uwaga: Podczas dodawania upewnij się, że zaznaczone jest „skopiuj elementy w razie potrzeby”.
2) Utwórz klasę AppManager.swift. Ta klasa będzie służyć jako klasa modelu publicznego, do której zostaną dodane publiczne metody i dane, które można wykorzystać w dowolnym VC.
3) Stwórz delegowaną klasę. Używam metody delegowania, aby powiadomić o stanie łączności.
4) Utwórz klasę nadrzędną UIViewController (metoda dziedziczenia). Klasa nadrzędna ma metody, które są dostępne dla wszystkich potomnych VC.
5) Uruchom monitorowanie połączeń internetowych w czasie rzeczywistym w AppDelegate.
6) Dodałem AppReference Swift File Name do przechowywania stałych wartości wyliczania.
7) W ViewController (np. Chcesz wywołać API tylko wtedy, gdy sieć jest dostępna)
Próbkę można pobrać @ https://github.com/alvinreuben/Reachability-Sample
Aktualizacja do Swift 3.1- https://github.com/alvinvgeorge/Reachability-UpgradedToSwift3
źródło
Apple wprowadziło Network Framework w iOS12.
źródło
pathUpdateHandler
wprowadzi silne odniesienie doself
, doda[weak self]
do rozwiązania :)Użyj tego dla Swift-5 +
Stosowanie:
Lub Po prostu użyj tego,
framework
aby uzyskać więcejUtilities
: Linkźródło
Właśnie to wymyśliłem.
Xcode: 7.3.1, iOS 9.3.3
Używając ashleymills / Reachability.swift jako Reachability.swift w moim projekcie, stworzyłem następującą funkcję:
Po prostu zadzwoń
hasConnectivity()
tam, gdzie chcesz sprawdzić połączenie. Działa to zarówno w sieci Wi-Fi, jak i komórkowej.Dodanie Ashleymills's Reachability.swift, aby ludzie nie musieli przemieszczać się między witrynami:
źródło
let reachability: Reachability = try Reachability.reachabilityForInternetConnection()
nalet reachability: Reachability = try Reachability()!
Chociaż nie odpowiada bezpośrednio na twoje pytanie, chciałbym wspomnieć, że Apple niedawno miał tę rozmowę:
https://developer.apple.com/videos/play/wwdc2018/714/
Około 09:55 mówi o robieniu rzeczy, o które pytasz:
Ma to jednak kilka pułapek:
Następujące punkty to niektóre najlepsze praktyki według Apple:
waitsForConnectivity
na true ( https://developer.apple.com/documentation/foundation/urlsessionconfiguration/2908812-waitsforconnectivity )taskIsWaitingForConnectivity
( https://developer.apple.com/documentation/foundation/urlsessiontaskdelegate/2908819-urlsession ). Jest to zalecany przez Apple sposób sprawdzania łączności, jak wspomniano w filmie o 33:25.Zgodnie z rozmową nie powinno być żadnego powodu, by sprawdzać, czy masz połączenie internetowe, czy nie, ponieważ może to nie być dokładne w momencie wysyłania żądania na serwer .
źródło
Stworzyłem własne rozwiązanie przy użyciu NSTimer i Alamofire:
NSTimer jest używany jako limit czasu i został użyty z powodu niewiarygodnych wyników przy użyciu limitu czasu Alamofire. Żądanie powinno zostać przesłane na adres URL, który jest zaufany, aby był niezawodny, na przykład na własny serwer lub serwer, na którym znajdują się usługi, na których można polegać.
Po wygaśnięciu timera żądanie jest anulowane, a wyniki są zwracane za pomocą procedury obsługi zakończenia.
Stosowanie:
źródło
requestTimeout()
byłoby nazwać po określony limit czasu został osiągniętyJeśli używasz Alamofire, możesz zrobić coś takiego:
źródło
tutaj moje rozwiązanie dla swift 2.3 z lib ( Reachability.swift )
Wejdź do swojego
Podfile
i dodaj:Następnie do
terminal
:Następnie utwórz nowy plik
ReachabilityManager
i dodaj kod poniżej:Jak tego użyć:
idź do
AppDelegate.swift
i dodaj poniższy kod:Następnie, jeśli chcesz sprawdzić, czy urządzenie jest podłączone do Internetu:
źródło
Chociaż nie może bezpośrednio określić, czy telefon jest podłączony do sieci, najprostszym (najczystszym?) Rozwiązaniem byłoby „pingowanie” Google'a lub innego serwera (co nie jest możliwe, chyba że telefon jest podłączony do sieci ):
Jeśli obawiasz się, że serwer może być wyłączony lub może zablokować twoje IP, zawsze możesz pingować wiele serwerów w podobny sposób i zwrócić, czy któryś z nich jest osiągalny. Lub niech ktoś skonfiguruje serwer dedykowany tylko w tym celu.
źródło
Szybki 5
W dowolnej metodzie użyj poniższego warunku
źródło
Za pomocą poniższego kodu możesz sprawdzić połączenie internetowe zarówno dla sieci komórkowej, jak i dla Wi-Fi. język - Swift 3.0
źródło
W przypadku swift 3 nie mogłem użyć tylko osiągalności z rozwiązań RAJAMOHAN-S, ponieważ zwraca „prawda”, jeśli jest WiFi, ale nie ma Internetu. Dlatego zaimplementowałem drugą weryfikację za pomocą klasy URLSession i modułu obsługi zakończenia.
Oto cała klasa.
I nazywasz to tak, na przykład:
źródło
To jest moja wersja. Zasadniczo nie przynosi niczego nowego. Związałem to z UIDevice.
źródło
Nazwij to teraz
źródło