Ich frage mich, wie ich überprüfen kann, ob der Benutzer über WIFI oder Mobilfunkdaten 3G oder 4G eine Verbindung zum Internet herstellt.
Ich möchte auch nicht prüfen, ob eine Website erreichbar ist oder nicht. Die Sache, die ich prüfen möchte, ob Internet auf dem Gerät vorhanden ist oder nicht. Ich habe versucht, über das Internet nachzuschauen, wenn ich sehe, dass die Website mit der Rechability
-Klasse erreichbar ist oder nicht.
Ich möchte prüfen, ob der Benutzer Internet hat oder nicht, wenn er meine Anwendung öffnet.
Ich verwende Xcode6 mit Objective-C.
Verwenden Sie diesen Code und importieren Sie die Reachability.h
-Datei
if ([[Reachability reachabilityForInternetConnection]currentReachabilityStatus]==NotReachable)
{
//connection unavailable
}
else
{
//connection available
}
Erste Erreichbarkeitsklassen von diesem Link herunterladen:
Wiederholbarkeit von Github
Instanz der Erreichbarkeit in AppDelegate.h hinzufügen
@property (nonatomic) Reachability *hostReachability;
@property (nonatomic) Reachability *internetReachability;
@property (nonatomic) Reachability *wifiReachability;
Importieren Sie die Erreichbarkeit in Ihrer AppDelegate und kopieren Sie diesen Code einfach in Ihre Appdelegate.m
- (id)init
{
self = [super init];
if (self != nil)
{
//[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachabilityChanged:) name:kReachabilityChangedNotification object:nil];
NSString *remoteHostName = @"www.google.com";
self.hostReachability = [Reachability reachabilityWithHostName:remoteHostName];
[self.hostReachability startNotifier];
self.internetReachability = [Reachability reachabilityForInternetConnection];
[self.internetReachability startNotifier];
self.wifiReachability = [Reachability reachabilityForLocalWiFi];
[self.wifiReachability startNotifier];
}
return self;
}
Fügen Sie diese Methode Ihrer allgemeinen Klasse hinzu.
/*================================================================================================
Check Internet Rechability
=================================================================================================*/
+(BOOL)checkIfInternetIsAvailable
{
BOOL reachable = NO;
NetworkStatus netStatus = [APP_DELEGATE1.internetReachability currentReachabilityStatus];
if(netStatus == ReachableViaWWAN || netStatus == ReachableViaWiFi)
{
reachable = YES;
}
else
{
reachable = NO;
}
return reachable;
}
Beachten Sie, dass APP_DELEGATE1 eine Instanz von AppDelegate ist
/* AppDelegate object */
#define APP_DELEGATE1 ((AppDelegate*)[[UIApplication sharedApplication] delegate])
Mit dieser Methode können Sie die Internetverbindung an jedem Ort der App überprüfen.
Ich hoffe, dies hilft Ihnen, sich nur im WLAN-Modus zu vernetzen:
Utils.h
#import <Foundation/Foundation.h>
@interface Utils : NSObject
+(BOOL)isNetworkAvailable;
@end
utils.m
+ (BOOL)isNetworkAvailable
{
CFNetDiagnosticRef dReference;
dReference = CFNetDiagnosticCreateWithURL (NULL, (__bridge CFURLRef)[NSURL URLWithString:@"www.Apple.com"]);
CFNetDiagnosticStatus status;
status = CFNetDiagnosticCopyNetworkStatusPassively (dReference, NULL);
CFRelease (dReference);
if ( status == kCFNetDiagnosticConnectionUp )
{
NSLog (@"Connection is Available");
return YES;
}
else
{
NSLog (@"Connection is down");
return NO;
}
}
// Benutze dies jetzt in der erforderlichen Klasse
- (IBAction)MemberSubmitAction:(id)sender {
if([Utils isNetworkAvailable] ==YES){
NSlog(@"Network Connection available");
}
}
es ist einfach, Sie können die folgende Methode verwenden, um die Internetverbindung zu überprüfen.
-(BOOL)IsConnectionAvailable
{
Reachability *reachability = [Reachability reachabilityForInternetConnection];
NetworkStatus networkStatus = [reachability currentReachabilityStatus];
return !(networkStatus == NotReachable);
}
Versuchen Sie dies, um die Internetverbindung zu überprüfen oder nicht
NSURL *url = [NSURL URLWithString:@"http://www.appleiphonecell.com/"];
NSMutableURLRequest *headRequest = [NSMutableURLRequest requestWithURL:url];
headRequest.HTTPMethod = @"HEAD";
NSURLSessionConfiguration *defaultConfigObject = [NSURLSessionConfiguration ephemeralSessionConfiguration];
defaultConfigObject.timeoutIntervalForResource = 10.0;
defaultConfigObject.requestCachePolicy = NSURLRequestReloadIgnoringLocalAndRemoteCacheData;
NSURLSession *defaultSession = [NSURLSession sessionWithConfiguration:defaultConfigObject delegate:nil delegateQueue: [NSOperationQueue mainQueue]];
NSURLSessionDataTask *dataTask = [defaultSession dataTaskWithRequest:headRequest
completionHandler:^(NSData *data, NSURLResponse *response, NSError *error)
{
if (!error && response)
{
block([(NSHTTPURLResponse *)response statusCode] == 200);
}else{
block(FALSE);
}
}];
[dataTask resume];
'Erreichbarkeit' funktioniert nicht, da es nicht erkennt, ob der Host eine Antwort gibt oder nicht. Es wird nur geprüft, ob der Client ein Paket an den Host senden kann. Selbst wenn Sie mit einem WLAN-Netzwerk verbunden sind und das Internet des WiFi ausgefallen ist oder der Server ausgefallen ist, erhalten Sie ein "JA" für die Erreichbarkeit.
Eine bessere Methode ist, eine HTTP-Anforderung auszuprobieren und die Antwort zu überprüfen.
Beispiel unten:
NSURL *pageToLoadUrl = [[NSURL alloc] initWithString:@"https://www.google.com/"];
NSMutableURLRequest *pageRequest = [NSMutableURLRequest requestWithURL:pageToLoadUrl];
[pageRequest setTimeoutInterval:2.0];
AFHTTPRequestOperation *pageOperation = [[AFHTTPRequestOperation alloc] initWithRequest:pageRequest];
AFRememberingSecurityPolicy *policy = [AFRememberingSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];
[policy setDelegate:self];
currentPageOperation.securityPolicy = policy;
if (self.ignoreSSLCertificate) {
NSLog(@"Warning - ignoring invalid certificates");
currentPageOperation.securityPolicy.allowInvalidCertificates = YES;
}
[pageOperation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
internetActive = YES;
} failure:^(AFHTTPRequestOperation *operation, NSError *error){
NSLog(@"Error:------>%@", [error description]);
internetActive = NO;
}];
[pageOperation start];
Der einzige Nachteil ist, dass "internetActive" mit einer Verzögerung bis zu dem im obigen Code genannten Timeout aktualisiert wird. Sie können im Callback Code eingeben, um auf den Status zu reagieren.
Aktualisierte Antwort für Swift 4.0 und AlamoFire:
Die Antwort, die ich am 18. September gepostet habe, ist falsch. Sie erkennt nur, ob sie mit dem Netzwerk verbunden ist, nicht mit dem Internet. Hier ist die richtige Lösung mit AlamoFire:
1) Erstellen Sie eine benutzerdefinierte Erreichbarkeitsbeobachtungsklasse:
import Alamofire
class ReachabilityObserver {
fileprivate let reachabilityManager = NetworkReachabilityManager()
fileprivate var reachabilityStatus: NetworkReachabilityManager.NetworkReachabilityStatus = .unknown
var isOnline: Bool {
if (reachabilityStatus == .unknown || reachabilityStatus == .notReachable){
return false
}else{
return true
}
}
static let sharedInstance = ReachabilityObserver()
fileprivate init () {
reachabilityManager?.listener = {
[weak self] status in
self?.reachabilityStatus = status
NotificationCenter.default.post(
name: NSNotification.Name(rawValue: ClickUpConstants.ReachabilityStateChanged),
object: nil)
}
reachabilityManager?.startListening()
}
}
2) Beim Start der App initialisieren
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
_ = ReachabilityObserver.sharedInstance
return true
}
3) Verwenden Sie dies überall in Ihrer App, um festzustellen, ob Online geladen wurde, z. B. in View geladen wurde oder wann eine Aktion ausgeführt wird
if (ReachabilityObserver.sharedInstance.isOnline){
//User is online
}else{
//User is not online
}
Reachability* reachability = [Reachability reachabilityWithHostName:@"www.google.com"];
NetworkStatus internetStatus = [reachability currentReachabilityStatus];
if(remoteHostStatus == ReachableViaWWAN || remoteHostStatus == ReachableViaWiFi)
{
//my web-dependent code
}
else {
//there-is-no-connection warning
}
Alamofire-Bibliothek verwenden :
let reachabilityManager = NetworkReachabilityManager()
let isReachable = reachabilityManager.isReachable
if (isReachable) {
//Has internet
}else{
//No internet
}
Versuche dies
Überprüfen Sie diesen Link für die Erreichbarkeitsdatei
importiere diese Datei in deine .m und schreibe dann Code
// Hiermit prüfen Sie die Internetverbindung
BOOL hasInternetConnection = [[Reachability reachabilityForInternetConnection] isReachable];
if (hasInternetConnection) {
// your code
}
Ich hoffe es hilft.