İOS'ta İnternet bağlantısını tespit etmenin en kolay yolu?


147

Bu sorunun başkalarının bir dupu gibi görüneceğini biliyorum, ancak basit durumun burada iyi açıklandığını hissetmiyorum. Android ve BlackBerry arka planından geliyor, HTTPUrlConnectionbağlantı yoksa istekleri anında başarısız oluyor. Bu tamamen akılcı bir davranış gibi görünüyor ve NSURLConnectioniOS'ta taklit etmediğine şaşırdım .

Apple'ın (ve onu genişleten diğerlerinin) Reachabilityağ durumunun belirlenmesine yardımcı olacak bir sınıf sağladığını anlıyorum . Öncelikle bunu görmekten mutlu oldum ve böyle bir şey görmeyi tamamen bool isNetworkAvailable()bekledim, ancak sürprizime göre, bildirim kayıtları ve geri aramalar gerektiren karmaşık bir sistem ve görünüşte gereksiz detaylar buldum. Daha iyi bir yol olmalı.

Uygulamam, bağlantı yok da dahil olmak üzere bağlantı hatalarını zaten ele alıyor. Kullanıcıya hata bildirilir ve uygulama devam eder.

Bu yüzden benim gereksinimleri basit: Tek, senkronize fonksiyon Ben aslında isteği gönderme gerçekten rahatsız olup olmadığını belirlemek için tüm HTTP istekleri önce arayabilirsiniz. İdeal olarak kurulum gerektirmez ve sadece bir boole döndürür.

İOS'ta bu gerçekten mümkün değil mi?



Her HTTP isteğinden önce asla eşzamanlı bir ağ erişilebilirliği yöntemini çağırmamalısınız; ulaşılabilirlik, ağ koşullarında bir değişiklik olduğunu söylemediği ve HTTP isteğini göndermemeyi seçmediği sürece bu işi yapmak biraz çılgınca olur. Zaman aşımlarının var olmasının nedeni de budur (ve sonra bu senaryoyu zarif bir şekilde ele almalısınız).
Eşzamansız

Yanıtlar:


251

Biraz daha araştırma yaptım ve cevabımı daha güncel bir çözümle güncelliyorum. Zaten ona bakıp bakmadığınızdan emin değilim ama Apple tarafından sağlanan güzel bir örnek kod var.

Örnek kodu buradan indirin

Reachability.h ve Reachability.m dosyalarını projenize ekleyin. Ana bilgisayar erişilebilirliğinin, WiFi ile, WWAN vb.

Reachability *networkReachability = [Reachability reachabilityForInternetConnection];   
NetworkStatus networkStatus = [networkReachability currentReachabilityStatus];    
if (networkStatus == NotReachable) {        
    NSLog(@"There IS NO internet connection");        
} else {        
     NSLog(@"There IS internet connection");        
}

@ BenjaminPiette's: Projenize SystemConfiguration.framework eklemeyi unutmayın.


46
Projenize SystemConfiguration.framework eklemeyi unutmayın.
Benjamin Piette

1
@chandru Çalışır. Bu, ağ bağlantısını tespit etmenin en kolay ve etkili yoludur. Basit ve kolay!
S1U

3
Buna dikkat et. En azından simülatörde ağ geri yüklendiğinde güvenilir bir şekilde çalışmadığını görüyorum. Ben wifi kapalı ile başlatmak, ve doğru ağ mevcut raporlar; ama sonra wifi'yi tekrar açıyorum ve SCNetworkReachabilityGetFlags, gerçek ağ sorguları gayet iyi çalışsa bile 0 döndürmeye devam ediyor.
Joe Strout

2
Aşağıdaki cevabımın ( stackoverflow.com/a/26593728/557362 ) daha az çalışma gerektirdiğine inanıyorum (başka dosya indirmeye gerek yok), ancak bu sadece benim görüşüm.
GilesDMiddleton

3
Bunun yalnızca belirli bir ana bilgisayarla bağlantının yönlendirilebilir olup olmadığını bildirdiğini unutmayın . Bu aslında bağlanabileceğiniz anlamına gelmez. Örnek: iPhone'unuzun wifi'sini kameranızın wifi'sine bağlarsınız. Kablosuz ağ varsayılan bir ağ geçidine bağlı: tüm ana bilgisayarlara erişilebilir. Ama aslında değiller - kamera çıkmaz bir bağlantı.
xaphod

45

Bu konu bu tür bir soru için en iyi google sonucu olarak görüyorum, benim için çalışan bir çözüm sağlayacak düşündüm. AFNetworking'i zaten kullanıyordum , ancak arama, projemin ortasındayken AFNetworking ile bu görevi nasıl başaracağınızı ortaya koymadı.

İstediğiniz şey AFNetworkingReachabilityManager .

// -- Start monitoring network reachability (globally available) -- //
[[AFNetworkReachabilityManager sharedManager] startMonitoring];

[[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {

    NSLog(@"Reachability changed: %@", AFStringFromNetworkReachabilityStatus(status));


    switch (status) {
        case AFNetworkReachabilityStatusReachableViaWWAN:
        case AFNetworkReachabilityStatusReachableViaWiFi:
            // -- Reachable -- //
            NSLog(@"Reachable");
            break;
        case AFNetworkReachabilityStatusNotReachable:
        default:
            // -- Not reachable -- //
            NSLog(@"Not Reachable");
            break;
    }

}];

Ulaşılabilirliği eşzamanlı olarak test etmek için aşağıdakileri de kullanabilirsiniz (izleme başladıktan sonra):

-(BOOL) isInternetReachable
{
    return [AFNetworkReachabilityManager sharedManager].reachable;
}

3
Işığa getirdiği için oy verdim AFNetworkReachabilityManager!
Selvin

Bunun hemen fark edilmediği kişiler için: AFNetworking üçüncü taraf bir kütüphanedir.
arlomedia

1
Ağ erişilebilirliği, bir isteğin neden başarısız olabileceğini anlamak için kullanılabilen bir tanılama aracıdır. Bir istekte bulunup bulunmayacağını belirlemek için kullanılmamalıdır. - Dokümantasyon böyle söylüyor.
Nosov Pavel

AFNetworkReachabilityManager.reachableherhangi bir eşzamanlı kontrol gerçekleştirmez. Mantıksal veya reachableViaWWANve değerlerini döndürür reachableViaWifi.
jdolan

40

Çok geç cevap verdiğim için üzgünüm ama umarım bu cevap gelecekte birine yardımcı olabilir.

Aşağıda, herhangi bir ek sınıf olmadan internet bağlantısını kontrol edebilen küçük bir yerel C kodu snippet'i bulunmaktadır.

Aşağıdaki başlıkları ekleyin:

#include<unistd.h>
#include<netdb.h>

Kod:

-(BOOL)isNetworkAvailable
{
    char *hostname;
    struct hostent *hostinfo;
    hostname = "google.com";
    hostinfo = gethostbyname (hostname);
    if (hostinfo == NULL){
        NSLog(@"-> no connection!\n");
        return NO;
    }
    else{
        NSLog(@"-> connection established!\n");
        return YES;
    }
}

Hızlı 3

func isConnectedToInternet() -> Bool {
    let hostname = "google.com"
    //let hostinfo = gethostbyname(hostname)
    let hostinfo = gethostbyname2(hostname, AF_INET6)//AF_INET6
    if hostinfo != nil {
        return true // internet available
      }
     return false // no internet
    }

3
Apple Reachability'den çok daha iyi çalışıyor. Ancak docs göre gethostbyname eski ve getaddrinfo kullanmalısınız: struct addrinfo * res = NULL; int s = getaddrinfo ("apple.com", NULL, NULL ve res); bool network_ok = (s == 0 && res! = NULL); freeaddrinfo (S);
Tertium

1
İnternet kullanılabilirliğini kontrol etmek için google.com'u kullanmak yaygın olsa da, bazı ülkelerde engellendiğini belirtmek gerekir. Daha iyi bir seçim, yahoo.com veya microsoft.com gibi daha "devlet dostu" şirketlerden alan adları olacaktır.
laurent

8
@Laurent: En iyi seçenek, veri isteyeceğiniz sunucu adresini kullanmaktır. Burada google.com sadece bir örnektir.
dispatchMain

7
Bu sadece bir DNS araması mı yapıyor? Öyleyse, önbelleğe alınmış bir DNS sonucu, işlevin hatalı bir şekilde ağın kullanılabilir olduğuna inanmasına neden olabilir mi?
Stephen Moore

2
@amar Bunu bir döngüde çalıştırmak kablosuz veri tüketir, bunu yapmak istemezsiniz.
anlam önemlidir

31

Şu anda projelerinizde veya delegelerinizde fazladan dosya gerektirmeyen bu basit eşzamanlı yöntemi kullanıyorum.

İthalat:

#import <SystemConfiguration/SCNetworkReachability.h>

Bu yöntemi oluşturun:

+(bool)isNetworkAvailable
{
    SCNetworkReachabilityFlags flags;
    SCNetworkReachabilityRef address;
    address = SCNetworkReachabilityCreateWithName(NULL, "www.apple.com" );
    Boolean success = SCNetworkReachabilityGetFlags(address, &flags);
    CFRelease(address);

    bool canReach = success
                    && !(flags & kSCNetworkReachabilityFlagsConnectionRequired)
                    && (flags & kSCNetworkReachabilityFlagsReachable);

    return canReach;
}

Sonra, bunu bir şeye koyarsanız MyNetworkClass:

if( [MyNetworkClass isNetworkAvailable] )
{
   // do something networky.
}

Simülatörde test yapıyorsanız, simülatör telefon ayarını yok sayacak gibi göründüğü için Mac'inizin wifi özelliğini açıp kapatın.

Güncelleme:

  1. Sonunda ana iş parçacığını engellemek için bir iş parçacığı / eşzamansız geri arama kullandım; önbelleğe alınmış bir sonuç kullanabilmem için düzenli olarak yeniden test ediyorum; ancak veri bağlantılarını gereksiz yere açık tutmaktan kaçınmalısınız.

  2. @ Thunk açıklandığı gibi, Apple'ın kendilerinin kullandığı daha iyi URL'ler vardır. http://cadinc.com/blog/why-your-apple-ios-7-device-wont-connect-to-the-wifi-network


1
Teşekkürler ve bu konudaki diğerlerinin çoğu ile aynı: Projenize SystemConfiguration.framework eklemeyi unutmayın.
eselk

1
Garip, Xcode projemde SystemConfiguration.framework eklememe gerek yoktu. SpriteKit, UIKit, StoreKit, Foundation ve CoreGraphics var, ama SystemConfiguration değil .... Bazı örtük içerme var mı?
GilesDMiddleton

3
Bu benim için çalıştı, ancak İnternet bağlantısı olmayan bir wi-fi ağına bağlandığımda çalıştırdığımda, kullanıcı arayüzümü yaklaşık 30 saniye boyunca kilitledi. Bu durumda eşzamansız bir yaklaşıma ihtiyaç vardır.
arlomedia

2
www.apple.combüyük bir web sitesi ... daha iyi bir seçenek olacakwww.google.com
Fahim Parkar

2
mükemmel cevap! Bir öneri: Test URL'si, www.appleiphonecell.combu amaç için kesinlikle kullanılabilir ve Çin'de görünüşte engellenmiyor.
Thunk

11

Uygulamayı bitirdiğinizde bakmanız mümkündür ve bu çok basittir - bu da çok basittir, çünkü ihtiyacınız olan tek öğe iki boole değişkendir: internet erişimi ve ana bilgisayar erişimi (genellikle bunlardan birden fazlasına ihtiyacınız vardır) ). Bağlantı durumunu belirleyebilen yardımcı sınıfınızı bir araya getirdikten sonra, bu prosedürleri bilmek için gereken uygulamayı bir daha umursamazsınız.

Misal:

#import <Foundation/Foundation.h>

@class Reachability;

@interface ConnectionManager : NSObject {
    Reachability *internetReachable;
    Reachability *hostReachable;
}

@property BOOL internetActive;
@property BOOL hostActive;

- (void) checkNetworkStatus:(NSNotification *)notice;

@end

Ve .m dosyası:

#import "ConnectionManager.h"
#import "Reachability.h"

@implementation ConnectionManager
@synthesize internetActive, hostActive;

-(id)init {
    self = [super init];
    if(self) {

    }
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(checkNetworkStatus:) name:kReachabilityChangedNotification object:nil];

    internetReachable = [[Reachability reachabilityForInternetConnection] retain];
    [internetReachable startNotifier];

    hostReachable = [[Reachability reachabilityWithHostName:@"www.apple.com"] retain];
    [hostReachable startNotifier];

    return self;
}

- (void) checkNetworkStatus:(NSNotification *)notice {
    NetworkStatus internetStatus = [internetReachable currentReachabilityStatus];
    switch (internetStatus)

    {
        case NotReachable:
        {
            NSLog(@"The internet is down.");
            self.internetActive = NO;

            break;

        }
        case ReachableViaWiFi:
        {
            NSLog(@"The internet is working via WIFI.");
            self.internetActive = YES;

            break;

        }
        case ReachableViaWWAN:
        {
            NSLog(@"The internet is working via WWAN.");
            self.internetActive = YES;

            break;

        }
    }

    NetworkStatus hostStatus = [hostReachable currentReachabilityStatus];
    switch (hostStatus)

    {
        case NotReachable:
        {
            NSLog(@"A gateway to the host server is down.");
            self.hostActive = NO;

            break;

        }
        case ReachableViaWiFi:
        {
            NSLog(@"A gateway to the host server is working via WIFI.");
            self.hostActive = YES;

            break;

        }
        case ReachableViaWWAN:
        {
            NSLog(@"A gateway to the host server is working via WWAN.");
            self.hostActive = YES;

            break;

        }
    }

}

// If lower than SDK 5 : Otherwise, remove the observer as pleased.

- (void)dealloc {
    [[NSNotificationCenter defaultCenter] removeObserver:self];
    [super dealloc];
}

@end


4

Ben kodu çıkardı ve tek bir yöntem koymak, başkalarına yardımcı olacağını umuyoruz.

#import <SystemConfiguration/SystemConfiguration.h>

#import <netinet/in.h>
#import <netinet6/in6.h>

...

- (BOOL)isInternetReachable
{    
    struct sockaddr_in zeroAddress;
    bzero(&zeroAddress, sizeof(zeroAddress));
    zeroAddress.sin_len = sizeof(zeroAddress);
    zeroAddress.sin_family = AF_INET;

    SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault, (const struct sockaddr*)&zeroAddress);
    SCNetworkReachabilityFlags flags;

    if(reachability == NULL)
        return false;

    if (!(SCNetworkReachabilityGetFlags(reachability, &flags)))
        return false;

    if ((flags & kSCNetworkReachabilityFlagsReachable) == 0)
        // if target host is not reachable
        return false;


    BOOL isReachable = false;


    if ((flags & kSCNetworkReachabilityFlagsConnectionRequired) == 0)
    {
        // if target host is reachable and no connection is required
        //  then we'll assume (for now) that your on Wi-Fi
        isReachable = true;
    }


    if ((((flags & kSCNetworkReachabilityFlagsConnectionOnDemand ) != 0) ||
         (flags & kSCNetworkReachabilityFlagsConnectionOnTraffic) != 0))
    {
        // ... and the connection is on-demand (or on-traffic) if the
        //     calling application is using the CFSocketStream or higher APIs

        if ((flags & kSCNetworkReachabilityFlagsInterventionRequired) == 0)
        {
            // ... and no [user] intervention is needed
            isReachable = true;
        }
    }

    if ((flags & kSCNetworkReachabilityFlagsIsWWAN) == kSCNetworkReachabilityFlagsIsWWAN)
    {
        // ... but WWAN connections are OK if the calling application
        //     is using the CFNetwork (CFSocketStream?) APIs.
        isReachable = true;
    }


    return isReachable;


}

[A] Bu kodu nereden çıkardın? Kaynağa bir bağlantı gönderebilir misiniz? [B] Çıkartma çalışmalarınız için çok teşekkür ederim! Tam ihtiyacım olan şey. Bu işi kendim yapmak üzereydim.
Basil Bourque

Yani, herhangi bir uzak sunucuyu / sunucuları kontrol etmeyen tek cevap bu gibi mi görünüyor?
Jasper

Bunu MacOS'ta test eden diğer kullanıcılar için kSCNetworkReachabilityFlagsIsWWAN'ın macOS için değil OS_IPHONE için olduğunu unutmayın.
GeoffCoope

4

Kabul edilen cevabın hızlı versiyonunu buraya yazıyorumBirisi yararlı bulursa, kod hızlı bir şekilde yazılırsa, ,

Gerekli dosyaları şuradan indirebilirsiniz: SampleCode'dan

Projenize ekleyin Reachability.hve Reachability.mdosyalayın,

Şimdi Bridging-Header.hprojeniz için herhangi bir dosya yoksa, dosya oluşturmanız gerekir ,

Senin İçinde Bridging-Header.hdosyasına bu satırı ekleyin:

#import "Reachability.h"

Şimdi İnternet Bağlantısını kontrol etmek için

static func isInternetAvailable() -> Bool {
    let networkReachability : Reachability = Reachability.reachabilityForInternetConnection()
    let networkStatus : NetworkStatus = networkReachability.currentReachabilityStatus()

    if networkStatus == NotReachable {
        print("No Internet")
        return false
    } else {
        print("Internet Available")
        return true
    }

}

3

Sanırım bu yardımcı olabilir ..

[[AFNetworkReachabilityManager sharedManager] startMonitoring];

if([AFNetworkReachabilityManager sharedManager].isReachable)
{
    NSLog(@"Network reachable");
}
else
{   
   NSLog(@"Network not reachable");
}

Ağ arayüzü değiştirilmezse ve internet bağlantısı kesilirse bu çalışmaz.
Pratik Somaiya

2

Projenizde AFNetworking'i önceden yapılandırdıysanız da bunu deneyebilirsiniz.

-(void)viewDidLoad{  // -- add connectivity notification --//
[[NSNotificationCenter defaultCenter ] addObserver:self selector:@selector(ReachabilityDidChangeNotification:) name:AFNetworkingReachabilityDidChangeNotification object:nil];}
-(void)ReachabilityDidChangeNotification:(NSNotification *)notify
{
// -- NSLog(@"Reachability changed: %@", AFStringFromNetworkReachabilityStatus(status));  -- //
NSDictionary *userInfo =[notif userInfo];
AFNetworkReachabilityStatus status= [[userInfo valueForKey:AFNetworkingReachabilityNotificationStatusItem] intValue];
switch (status)
{
    case AFNetworkReachabilityStatusReachableViaWWAN:
    case AFNetworkReachabilityStatusReachableViaWiFi:
        // -- Reachable -- //
// -- Do your stuff when internet connection is available -- //
        [self getLatestStuff];
        NSLog(@"Reachable");
        break;
    case AFNetworkReachabilityStatusNotReachable:
    default:
        // -- Not reachable -- //
        // -- Do your stuff for internet connection not available -- //
NSLog(@"Not Reachable");
        break;
}
}

1

Okunabilirlik kullanmadan Swift kullanarak bağlantıyı kontrol etmek için iyi bir çözüm. Bu blogda buldum .

Projenizde yeni bir Swift dosyası oluşturun Network.swift(örneğin). Bu kodu bu dosyanın içine yapıştırın:

import Foundation

public class Network {

    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
            }
        }

        return Status
    }
}

Daha sonra aşağıdakileri kullanarak projenizdeki herhangi bir yerde bağlantı olup olmadığını kontrol edebilirsiniz:

if Network.isConnectedToNetwork() == true {
    println("Internet connection OK")
} else {
    println("Internet connection FAILED")
}

0

EDIT: Bu ağ URL'leri için çalışmaz (yorumlara bakın)

İOS 5'ten itibaren yeni bir NSURL örnek yöntemi var:

- (BOOL)checkResourceIsReachableAndReturnError:(NSError **)error

Önem verdiğiniz web sitesine yönlendirin veya apple.com'a yönlendirin; İnternetin cihazınızda çalışıp çalışmadığını görmek için yeni tek hatlı çağrı olduğunu düşünüyorum.


Aslında kendi testlerimde bu her zaman yanlış döndürür. Dokümanlar bunun 4.x için geçerli olduğunu belirtiyor ancak 5+ sürümünde çalışıyor olması gerekiyor. YMMV
SG1

Bu, aradığınız durum için işe yaramıyor gibi görünüyor. Bkz. Stackoverflow.com/questions/9266154/…
Micah Hainline

7
İnternet URL'leri için değil, dosya URL'leri için kullanılır.
Victor Bogdan

0

Ayrıca mevcut Internet kontrol seçeneklerinden memnun değildi (Bu neden yerel bir API değil?!?!)

Benim sorunum% 100 paket kaybı ile ilgiliydi - bir cihaz yönlendiriciye bağlandığında, ancak yönlendirici İnternet'e bağlı olmadığında. Ulaşılabilirlik ve diğerleri uzun yıllar boyunca asılacaktır. Bir asenkron zaman aşımı ekleyerek bununla başa çıkmak için bir yarar singleton sınıfı oluşturdum. Benim app iyi çalışıyor. Umarım yardımcı olur. İşte github'daki bağlantı:

https://github.com/fareast555/TFInternetChecker


0

(İOS) Xcode 8.2, Swift 3.0'da İnternet bağlantısı kullanılabilirliğini kontrol etme

Bu, ağ kullanılabilirliğini kontrol etmek için basit bir yöntemdir. Swift 2.0'a ve burada son koda çevirmeyi başardım. Mevcut Apple Reachability sınıfı ve diğer üçüncü taraf kütüphaneleri, Swift'e çevrilemeyecek kadar karmaşık görünüyordu.

Bu hem 3G hem de WiFi bağlantıları için çalışır.

Proje oluşturucunuza “SystemConfiguration.framework” eklemeyi unutmayın.

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

import SystemConfiguration

public 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)
    let defaultRouteReachability = withUnsafePointer(to: &zeroAddress) {
        $0.withMemoryRebound(to: sockaddr.self, capacity: 1) {zeroSockAddress in
            SCNetworkReachabilityCreateWithAddress(nil, zeroSockAddress)
        }
    }
    var flags = SCNetworkReachabilityFlags()
    if !SCNetworkReachabilityGetFlags(defaultRouteReachability! , &flags) {
        return false
    }
    let isReachable = (flags.rawValue & UInt32(kSCNetworkFlagsReachable)) != 0
    let needsConnection = (flags.rawValue & UInt32(kSCNetworkFlagsConnectionRequired)) != 0
    return (isReachable && !needsConnection)
   }
}

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

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

Xcode sürüm 7.2 (7C68) ile bu kodun derleyici hataları var
Daniel

@Daniel, işaret eden sorun için teşekkürler, bu güvenli olmayan işaretçiler nedeniyle, Swift 2 / Xcode orada sözdizimlerini güncellediği için onları takip etmeliyiz. Ben aynı için güncellenmiş kod var. ty;)
ViJay Avhad

Bir wi-fi'ye bağlıysanız ancak internete bağlanamıyorsanız (bir google sayfası açın) yine de ulaşılabilir için true değerini döndürür. Yanlış.
Arildo Junior

0

Tonymillion'dan esinlenerek kapaklarla Swift'te yeniden yazılan Apple'ın Ulaşılabilirliği için yedek: https://github.com/ashleymills/Reachability.swift

  1. Dosyayı Reachability.swiftprojenize bırakın . Alternatif olarak, CocoaPods veya Carthage kullanın - Projenin README'sinin Kurulum bölümüne bakın .

  2. Ağ bağlantısı hakkında bildirim alın:

    //declare this property where it won't go out of scope relative to your listener
    let reachability = Reachability()!
    
    reachability.whenReachable = { reachability in
        if reachability.isReachableViaWiFi {
            print("Reachable via WiFi")
        } else {
            print("Reachable via Cellular")
        }
    }
    
    reachability.whenUnreachable = { _ in
        print("Not reachable")
    }
    
    do {
        try reachability.startNotifier()
    } catch {
        print("Unable to start notifier")
    }

    ve bildirimleri durdurmak için

    reachability.stopNotifier()

0

Alamofire

Eğer zaten Alamofire kullanıyorsanız tüm RESTful Api için , işte bundan faydalanabilirsiniz.

Uygulamanıza aşağıdaki sınıfı ekleyebilir MNNetworkUtils.main.isConnected()ve bağlı olup olmadığına dair bir boole almak için arayabilirsiniz .

#import Alamofire

class MNNetworkUtils {
  static let main = MNNetworkUtils()
  init() {
    manager = NetworkReachabilityManager(host: "google.com")
    listenForReachability()
  }

  private let manager: NetworkReachabilityManager?
  private var reachable: Bool = false
  private func listenForReachability() {
    self.manager?.listener = { [unowned self] status in
      switch status {
      case .notReachable:
        self.reachable = false
      case .reachable(_), .unknown:
        self.reachable = true
      }
    }
    self.manager?.startListening()
  }

  func isConnected() -> Bool {
    return reachable
  }
}

Bu bir singleton sınıfı. Kullanıcı ağı her bağladığında veya bağlantısını kestiğinde, self.reachabledoğru / yanlış değerine geçersiz kılınır , çünkü NetworkReachabilityManagertek tek başlatmayı dinlemeye başlarız .

Ayrıca, erişilebilirliği izlemek için bir ana bilgisayar sağlamanız gerekir, şu anda google.comgerekirse başka herhangi bir ana bilgisayara veya bir tanesine geçmek için çekinmeyin.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.