Cara termudah untuk mendeteksi koneksi Internet di iOS?

147

Saya tahu pertanyaan ini akan tampak seperti penipuan banyak orang lain, namun, saya tidak merasa kasus sederhana dijelaskan dengan baik di sini. Berasal dari latar belakang Android dan BlackBerry, membuat permintaan HTTPUrlConnectiongagal secara instan jika tidak ada koneksi. Ini sepertinya perilaku yang benar-benar waras, dan saya terkejut menemukan NSURLConnectiondi iOS tidak meniru itu.

Saya mengerti bahwa Apple (dan lainnya yang telah memperpanjangnya) menyediakan Reachabilitykelas untuk membantu menentukan keadaan jaringan. Saya senang untuk pertama kali melihat ini dan sepenuhnya diharapkan untuk melihat sesuatu seperti bool isNetworkAvailable(), tetapi saya terkejut menemukan sistem yang rumit yang membutuhkan pendaftaran notifikasi dan panggilan balik, dan banyak detail yang tampaknya tidak perlu. Pasti ada cara yang lebih baik.

Aplikasi saya sudah dengan anggun menangani kegagalan koneksi, termasuk tidak ada konektivitas. Pengguna diberitahu tentang kegagalan, dan aplikasi bergerak.

Jadi persyaratan saya sederhana: Satu, fungsi sinkron yang bisa saya panggil sebelum semua permintaan HTTP untuk menentukan apakah saya benar-benar harus mengirim permintaan atau tidak. Idealnya tidak memerlukan pengaturan dan hanya mengembalikan boolean.

Apakah ini benar-benar tidak mungkin di iOS?

RealCasually
sumber
Kemungkinan duplikat dari Cara memeriksa koneksi Internet aktif di iOS atau OSX?
iwasrobbed
Anda seharusnya tidak pernah memanggil metode jangkauan jaringan yang sinkron sebelum setiap permintaan HTTP; itu agak gila untuk melakukan pekerjaan itu kecuali jika jangkauannya secara tidak sinkron memberi tahu Anda ada perubahan dalam kondisi jaringan dan kemudian Anda dapat memilih untuk tidak mengirim permintaan HTTP. Ini juga seluruh alasan timeout ada (dan kemudian Anda harus menangani skenario itu dengan anggun). Lihat tautan di atas untuk cara async
iwasrobbed

Jawaban:

251

Saya melakukan sedikit riset lebih lanjut dan saya memperbarui jawaban saya dengan solusi yang lebih terkini. Saya tidak yakin apakah Anda sudah melihatnya tetapi ada contoh kode yang disediakan oleh Apple.

Unduh kode sampel di sini

Sertakan file Reachability.h dan Reachability.m dalam proyek Anda. Lihatlah ReachabilityAppDelegate.m untuk melihat contoh tentang cara menentukan jangkauan host, jangkauan dengan WiFi, oleh WWAN, dll. Untuk pemeriksaan jangkauan jaringan yang sangat sederhana, Anda dapat melakukan sesuatu seperti ini

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: Jangan lupa menambahkan SystemConfiguration.framework ke proyek Anda.

Semere Taézaz Sium
sumber
46
Jangan lupa untuk menambahkan SystemConfiguration.framework ke proyek Anda.
Benjamin Piette
1
@chandru Berhasil. Ini adalah cara termudah dan paling efektif yang saya lihat untuk mendeteksi koneksi jaringan. Sederhana dan Mudah!
S1U
3
Hati-hati dengan ini. Saya menemukan itu tidak berfungsi dengan andal ketika jaringan dipulihkan, setidaknya di simulator. Saya memulai dengan wifi off, dan benar melaporkan tidak ada jaringan yang tersedia; tapi kemudian saya mengaktifkan wifi kembali, dan SCNetworkReachabilityGetFlags terus mengembalikan 0, meskipun permintaan jaringan yang sebenarnya berfungsi dengan baik.
Joe Strout
2
Saya percaya jawaban saya di bawah ini ( stackoverflow.com/a/26593728/557362 ) membutuhkan lebih sedikit kerja (tidak mengunduh file lain), tapi itu hanya pendapat saya.
GilesDMiddleton
3
Perhatikan bahwa ini hanya memberi tahu Anda apakah koneksi ke host tertentu dapat dirutekan . Itu tidak berarti Anda benar-benar dapat terhubung. Contoh: Anda menghubungkan wifi iPhone Anda ke wifi kamera Anda. Wifi terhubung dengan gateway default: semua host akan melaporkan dapat dijangkau. Tapi sebenarnya tidak - kamera adalah koneksi buntu.
xaphod
45

Melihat utas ini adalah hasil google teratas untuk jenis pertanyaan ini, saya pikir saya akan memberikan solusi yang bekerja untuk saya. Saya sudah menggunakan AFNetworking , tetapi pencarian tidak mengungkapkan bagaimana menyelesaikan tugas ini dengan AFNetworking hingga pertengahan proyek saya.

Yang Anda inginkan adalah Manajer AFNetworkingReachability .

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

}];

Anda juga dapat menggunakan yang berikut ini untuk menguji jangkauan secara sinkron (setelah pemantauan dimulai):

-(BOOL) isInternetReachable
{
    return [AFNetworkReachabilityManager sharedManager].reachable;
}
Sherbertman
sumber
3
Saya memilih untuk membawa ke AFNetworkReachabilityManagerdalam cahaya!
Selvin
Bagi mereka yang belum jelas hal ini: AFNetworking adalah perpustakaan pihak ketiga.
arlomedia
1
Jangkauan jaringan adalah alat diagnostik yang dapat digunakan untuk memahami mengapa permintaan mungkin gagal. Seharusnya tidak digunakan untuk menentukan apakah akan membuat permintaan atau tidak. - Itulah yang dikatakan dokumentasi.
Nosov Pavel
AFNetworkReachabilityManager.reachableTIDAK melakukan segala jenis pemeriksaan sinkron. Ini mengembalikan logika atau reachableViaWWANdan reachableViaWifi.
jdolan
40

Maaf sudah terlambat menjawab, tapi saya harap jawaban ini dapat membantu seseorang di masa depan.

Berikut ini adalah cuplikan kode C kecil asli yang dapat memeriksa konektivitas internet tanpa kelas tambahan.

Tambahkan tajuk berikut:

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

Kode:

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

Cepat 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
    }
pengiriman utama
sumber
3
bekerja jauh lebih baik daripada Apple Reachability. Tetapi menurut docs gethostbyname sudah usang dan Anda harus menggunakan getaddrinfo: struct addrinfo * res = NULL; int s = getaddrinfo ("apple.com", NULL, NULL, & res); bool network_ok = (s == 0 && res! = NULL); freeaddrinfo (res);
Tertium
1
Meskipun umum menggunakan google.com untuk memeriksa ketersediaan internet, perlu dicatat bahwa itu diblokir di beberapa negara. Pilihan yang lebih baik adalah domain dari perusahaan yang lebih "ramah pemerintah" seperti yahoo.com atau microsoft.com.
laurent
8
@Laurent: Opsi terbaik adalah menggunakan alamat server tempat Anda akan meminta data. google.com di sini hanyalah sebuah contoh.
dispatchMain
7
Apakah ini hanya melakukan pencarian DNS? Jika demikian, dapatkah hasil DNS yang di-cache dapat mengakibatkan fungsi tersebut secara keliru meyakini bahwa jaringan itu tersedia?
Stephen Moore
2
@amar Menjalankan ini dalam satu lingkaran akan mengkonsumsi data nirkabel, Anda tidak ingin melakukan itu.
Makna-masalah
31

Saat ini saya menggunakan metode sinkron sederhana ini yang tidak memerlukan file tambahan dalam proyek atau delegasi Anda.

Impor:

#import <SystemConfiguration/SCNetworkReachability.h>

Buat metode ini:

+(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;
}

Kemudian, jika Anda memasukkan ini ke MyNetworkClass:

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

Jika Anda menguji dalam simulator, nyalakan dan matikan wifi Mac Anda, karena tampaknya simulator akan mengabaikan pengaturan ponsel.

Memperbarui:

  1. Pada akhirnya saya menggunakan utas / asinkron panggilan balik untuk menghindari pemblokiran utas utama; dan secara teratur menguji ulang sehingga saya bisa menggunakan hasil cache - meskipun Anda harus menghindari menjaga koneksi data tetap terbuka.

  2. Seperti yang dijelaskan oleh @thunk, ada URL yang lebih baik untuk digunakan, yang digunakan oleh Apple sendiri. http://cadinc.com/blog/why-your-apple-ios-7-device-wont-connect-to-the-wifi-network

GilesDMiddleton
sumber
1
Terima kasih, dan sama seperti kebanyakan orang lain di utas ini: Jangan lupa untuk menambahkan SystemConfiguration.framework ke proyek Anda.
eselk
1
Aneh, dalam proyek Xcode saya, saya tidak perlu menambahkan SystemConfiguration.framework. Saya punya SpriteKit, UIKit, StoreKit, Foundation dan CoreGraphics, tetapi tidak dengan SystemConfiguration .... Apakah ada penyertaan implisit yang terjadi?
GilesDMiddleton
3
Ini bekerja untuk saya, tetapi ketika saya menjalankannya ketika terhubung ke jaringan wi-fi yang tidak memiliki koneksi Internet, itu mengunci UI saya selama sekitar 30 detik. Pendekatan asinkron diperlukan dalam situasi itu.
arlomedia
2
www.apple.comadalah situs web besar ... pilihan yang lebih baik adalahwww.google.com
Fahim Parkar
2
jawaban yang sangat bagus! Satu saran: URL uji,, www.appleiphonecell.comseharusnya tersedia hanya untuk tujuan ini dan tampaknya tidak diblokir di Cina.
Thunk
11

Itu mungkin dan sangat sederhana jika Anda melihatnya ketika menyelesaikan implementasi, yang sekali lagi - sangat sederhana, karena satu-satunya item yang Anda butuhkan adalah dua variabel boolean: jangkauan internet dan jangkauan host (Anda sering membutuhkan lebih dari satu di antaranya) ). Setelah Anda merakit kelas pembantu Anda yang dapat menentukan status koneksi, Anda benar-benar tidak peduli lagi dengan implementasi yang diperlukan untuk mengetahui prosedur ini.

Contoh:

#import <Foundation/Foundation.h>

@class Reachability;

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

@property BOOL internetActive;
@property BOOL hostActive;

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

@end

Dan file .m:

#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
Danut Pralea
sumber
4

Saya mengekstrak kode dan memasukkan ke dalam satu metode tunggal, berharap itu akan membantu orang lain.

#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;


}
Walty Yeung
sumber
[A] Dari mana Anda mengekstrak kode ini? Bisakah Anda memposting tautan ke sumbernya? [B] Terima kasih banyak atas kerja ekstraksinya! Apa yang saya butuhkan. Saya akan melakukan tugas ini sendiri.
Basil Bourque
Jadi, sepertinya ini satu-satunya jawaban yang tidak memeriksa server jarak jauh?
Jasper
Untuk yang lain menguji ini pada MacOS, perhatikan bahwa kSCNetworkReachabilityFlagsIsWWAN adalah untuk OS_IPHONE, bukan macOS.
GeoffCoope
4

Saya menulis versi cepat dari jawaban yang diterima di sini , jika seseorang merasa bermanfaat, kode ini ditulis dengan cepat 2,

Anda dapat mengunduh file yang diperlukan dari SampleCode

Tambahkan Reachability.hdan Reachability.majukan ke proyek Anda,

Sekarang orang perlu membuat Bridging-Header.hfile jika tidak ada untuk proyek Anda,

Di dalam Bridging-Header.hfile Anda tambahkan baris ini:

#import "Reachability.h"

Sekarang untuk memeriksa Koneksi Internet

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
    }

}
Satyen Udeshi
sumber
3

Saya pikir ini bisa membantu ..

[[AFNetworkReachabilityManager sharedManager] startMonitoring];

if([AFNetworkReachabilityManager sharedManager].isReachable)
{
    NSLog(@"Network reachable");
}
else
{   
   NSLog(@"Network not reachable");
}
pooja
sumber
Ini tidak berfungsi jika antarmuka jaringan tidak diubah dan konektivitas internet terputus.
Pratik Somaiya
2

Anda juga dapat mencoba yang ini jika Anda sudah mengkonfigurasi AFNetworking di proyek Anda.

-(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;
}
}
Ravi Raja Jangid
sumber
1

Berikut adalah solusi yang bagus untuk memeriksa konektivitas menggunakan Swift, tanpa menggunakan Reachability. Saya menemukannya di blog ini .

Buat file Swift baru di proyek Anda yang disebut Network.swift(misalnya). Rekatkan kode ini di dalam file itu:

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

Anda kemudian dapat memeriksa konektivitas di mana saja di proyek Anda dengan menggunakan:

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

EDIT: Ini tidak akan berfungsi untuk URL jaringan (lihat komentar)

Pada iOS 5, ada metode instance NSURL baru:

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

Arahkan ke situs web yang Anda pedulikan atau arahkan ke apple.com; Saya pikir ini adalah panggilan satu saluran baru untuk melihat apakah internet berfungsi pada perangkat Anda.

SG1
sumber
Sebenarnya dalam tes saya sendiri ini selalu mengembalikan false. Dokumen menyatakan ini adalah kasus untuk 4.x tetapi dalam 5+ seharusnya berfungsi. YMMV
SG1
Tampaknya ini tidak berfungsi untuk situasi yang Anda cari. Lihat stackoverflow.com/questions/9266154/…
Micah Hainline
7
Itu digunakan untuk URL file, bukan URL Internet.
Victor Bogdan
0

Saya juga tidak senang dengan opsi pemeriksaan Internet yang tersedia (Mengapa ini bukan API asli?!?!)

Masalah saya sendiri adalah dengan hilangnya paket 100% - ketika perangkat terhubung ke router, tetapi router tidak terhubung ke Internet. Reachability dan lainnya akan bertahan lama. Saya membuat kelas utilitas tunggal untuk mengatasinya dengan menambahkan batas waktu asynch. Ini berfungsi dengan baik di aplikasi saya. Semoga ini bisa membantu. Inilah tautan di github:

https://github.com/fareast555/TFInternetChecker

Mike Critchley
sumber
0

Memeriksa ketersediaan koneksi Internet di (iOS) Xcode 8.2, Swift 3.0

Ini adalah metode sederhana untuk memeriksa ketersediaan jaringan. Saya berhasil menerjemahkannya ke Swift 2.0 dan di sini kode terakhir. Kelas Apple Reachability yang ada dan perpustakaan pihak ketiga lainnya tampaknya terlalu rumit untuk diterjemahkan ke Swift.

Ini berfungsi untuk koneksi 3G dan WiFi.

Jangan lupa untuk menambahkan "SystemConfiguration.framework" ke pembuat proyek Anda.

//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")
}
ViJay Avhad
sumber
Dengan Xcode versi 7.2 (7C68), kode ini memiliki kesalahan penyusun
Daniel
@Daniel, terima kasih telah menunjukkan masalah, ini karena pointer tidak aman, karena Swift 2 / Xcode memperbarui sintaksis di sana, kita harus mengikuti mereka. saya telah memperbarui kode untuk hal yang sama. ty;)
ViJay Avhad
Jika Anda terhubung ke wi-fi tetapi tidak dapat terhubung ke internet (buka halaman google) masih tetap benar untuk terjangkau. Itu salah.
Arildo Junior
0

Penggantian untuk Reachability Apple ditulis ulang dalam Swift dengan penutup , terinspirasi oleh tonymillion: https://github.com/ashleymills/Reachability.swift

  1. Letakkan file Reachability.swiftke proyek Anda. Atau, gunakan CocoaPods atau Carthage - Lihat bagian Instalasi README proyek.

  2. Dapatkan pemberitahuan tentang konektivitas jaringan:

    //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")
    }

    dan untuk menghentikan notifikasi

    reachability.stopNotifier()
Pierre F
sumber
0

Alamofire

Jika Anda sudah menggunakan Alamofire untuk semua RESTful Api, inilah yang dapat Anda manfaatkan dari itu.

Anda dapat menambahkan kelas berikut ke aplikasi Anda, dan menelepon MNNetworkUtils.main.isConnected()untuk mendapatkan boolean pada apakah itu terhubung atau tidak.

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

Ini adalah kelas tunggal. Setiap kali, ketika pengguna menghubungkan atau memutuskan jaringan, itu akan menimpa self.reachablebenar / salah dengan benar, karena kita mulai mendengarkan NetworkReachabilityManagerinisialisasi on singleton.

Juga untuk memantau jangkauan, Anda perlu menyediakan host, saat ini saya menggunakan google.comragu untuk mengubah ke host lain atau salah satu dari Anda jika diperlukan.

nuynait
sumber