Bagaimana cara memeriksa koneksi Internet aktif di iOS atau macOS?

1326

Saya ingin memeriksa untuk melihat apakah saya memiliki koneksi Internet di iOS menggunakan perpustakaan Cocoa Touch atau pada macOS menggunakan perpustakaan Cocoa .

Saya datang dengan cara untuk melakukan ini menggunakan NSURL. Cara saya melakukannya tampaknya agak tidak dapat diandalkan (karena bahkan suatu hari Google bisa turun dan mengandalkan pihak ketiga tampak buruk), dan sementara saya bisa memeriksa untuk melihat tanggapan dari beberapa situs web lain jika Google tidak merespons, itu memang tampak boros dan overhead yang tidak perlu pada aplikasi saya.

- (BOOL) connectedToInternet
{
    NSString *URLString = [NSString stringWithContentsOfURL:[NSURL URLWithString:@"http://www.google.com"]];
    return ( URLString != NULL ) ? YES : NO;
}

Apakah yang saya lakukan buruk, (belum lagi stringWithContentsOfURLditinggalkan di iOS 3.0 dan macOS 10.4) dan jika demikian, apa cara yang lebih baik untuk mencapai ini?

Brock Woolf
sumber
11
Sebaliknya return (BOOL)URLString;, atau bahkan lebih baik, return !!URLStringataureturn URLString != nil
3
Saya tidak tahu apa itu use case Anda, tetapi jika Anda bisa, lebih baik untuk mencoba permintaan dan menangani kesalahan seperti kurangnya koneksi yang muncul. Jika Anda tidak dapat melakukan ini, maka ada banyak saran bagus di sini dalam hal ini.
SK9
2
Solusi Anda cerdas, dan saya lebih suka. Anda juga dapat menggunakan NSString *URLString = [NSString stringWithContentsOfURL:[NSURL URLWithString:@"https://twitter.com/getibox"] encoding:NSUTF8StringEncoding error:nil];Untuk menyingkirkan peringatan yang mengganggu.
Abdelrahman Eid
4
coba gunakan kelas Reachability dari tautan di bawah ini, itu akan bekerja untuk Anda github.com/tonymillion/Reachability
Dhaval H. Nena
4
Bagi mereka yang baru-baru ini menemukan jawaban ini: stackoverflow.com/a/8813279
afollestad

Jawaban:

1285

Penting : Pemeriksaan ini harus selalu dilakukan secara tidak sinkron. Sebagian besar jawaban di bawah ini sinkron jadi berhati-hatilah karena jika tidak Anda akan membekukan aplikasi Anda.


Cepat

1) Pasang melalui CocoaPods atau Carthage: https://github.com/ashleymills/Reachability.swift

2) Uji kemampuan jangkau melalui penutupan

let reachability = Reachability()!

reachability.whenReachable = { reachability in
    if reachability.connection == .wifi {
        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")
}

Objektif-C

1) Tambahkan SystemConfigurationkerangka kerja ke proyek tetapi jangan khawatir tentang memasukkannya ke mana saja

2) Tambahkan versi Tony Million Reachability.hdan Reachability.mke proyek (ditemukan di sini: https://github.com/tonymillion/Reachability )

3) Perbarui bagian antarmuka

#import "Reachability.h"

// Add this to the interface in the .m file of your view controller
@interface MyViewController ()
{
    Reachability *internetReachableFoo;
}
@end

4) Kemudian implementasikan metode ini dalam file .m dari view controller Anda yang dapat Anda panggil

// Checks if we have an internet connection or not
- (void)testInternetConnection
{   
    internetReachableFoo = [Reachability reachabilityWithHostname:@"www.google.com"];

    // Internet is reachable
    internetReachableFoo.reachableBlock = ^(Reachability*reach)
    {
        // Update the UI on the main thread
        dispatch_async(dispatch_get_main_queue(), ^{
            NSLog(@"Yayyy, we have the interwebs!");
        });
    };

    // Internet is not reachable
    internetReachableFoo.unreachableBlock = ^(Reachability*reach)
    {
        // Update the UI on the main thread
        dispatch_async(dispatch_get_main_queue(), ^{
            NSLog(@"Someone broke the internet :(");
        });
    };

    [internetReachableFoo startNotifier];
}

Catatan Penting: The Reachabilityclass adalah salah satu yang paling kelas digunakan dalam proyek-proyek sehingga Anda mungkin mengalami konflik penamaan dengan proyek-proyek lainnya. Jika ini terjadi, Anda harus mengganti nama salah satu dari pasangan Reachability.hdanReachability.m file ke sesuatu yang lain untuk menyelesaikan masalah.

Catatan: Domain yang Anda gunakan tidak masalah. Itu hanya menguji gateway ke domain apa saja.

aku telah dirampok
sumber
4
@gonzobrains: Domain yang Anda gunakan tidak masalah. Itu hanya menguji gateway ke domain apa saja .
iwasrobbed
3
@KaanDedeoglu Ini hanya contoh, gunakan domain apa pun yang Anda inginkan. Itu hanya memeriksa gateway ke internet, bukan bahwa domain itu sebenarnya tersedia.
iwasrobbed
1
Oh, btw Anda perlu menambahkan SystemConfiguration.frameworkke proyek juga (untuk metode 1).
wiseindy
2
Gunakan www.appleiphonecell.com alih-alih google.com - url ini dibuat oleh apel karena alasan ini.
Smikey
1
Penggunaan www.appleiphonecell.com sekarang (2018) adalah pilihan yang buruk. Sekarang dialihkan ke Apple.com yang merupakan file html> 40kB. Kembali ke google.com - hanya 11kB. BTW google.com/m berukuran sama tetapi dilaporkan lebih lambat 120 msec.
BlueskyMed
311

Saya suka menjaga hal-hal sederhana. Cara saya melakukan ini adalah:

//Class.h
#import "Reachability.h"
#import <SystemConfiguration/SystemConfiguration.h>

- (BOOL)connected;

//Class.m
- (BOOL)connected
{
    Reachability *reachability = [Reachability reachabilityForInternetConnection];
    NetworkStatus networkStatus = [reachability currentReachabilityStatus];
    return networkStatus != NotReachable;
}

Lalu, saya menggunakan ini kapan pun saya ingin melihat apakah saya memiliki koneksi:

if (![self connected]) {
    // Not connected
} else {
    // Connected. Do some Internet stuff
}

Metode ini tidak menunggu perubahan status jaringan untuk melakukan hal-hal. Itu hanya menguji status ketika Anda memintanya.

cannyboy
sumber
Hai @ msec, Anda dapat mencoba solusi Andrew Zimmer di halaman ini, ini berfungsi baik dengan adsl terputus (dan wifi terhubung)
Williew
1
Bagi mereka yang hanya menyalin dan menempel seperti yang saya lakukan dengan kode di atas. Juga tambahkan SystemConfiguration.framework secara manual atau Anda akan mendapatkan kesalahan tautan.
Iftikhar Ali Ansari
Selalu bisa dijangkau jika saya terhubung dengan WiFi. WiFi tidak berarti memiliki koneksi internet. Saya ingin memverifikasi koneksi internet walaupun memiliki konektivitas WiFi. Bisakah Anda membantu saya?
wesley
@wesley Bagaimana Anda mengatasinya?
Keselme
146

Menggunakan kode Reachability Apple, saya membuat fungsi yang akan memeriksa ini dengan benar tanpa Anda harus menyertakan kelas apa pun.

Sertakan SystemConfiguration.framework dalam proyek Anda.

Buat impor:

#import <sys/socket.h>
#import <netinet/in.h>
#import <SystemConfiguration/SystemConfiguration.h>

Sekarang panggil saja fungsi ini:

/*
Connectivity testing code pulled from Apple's Reachability Example: https://developer.apple.com/library/content/samplecode/Reachability
 */
+(BOOL)hasConnectivity {
    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);
    if (reachability != NULL) {
        //NetworkStatus retVal = NotReachable;
        SCNetworkReachabilityFlags flags;
        if (SCNetworkReachabilityGetFlags(reachability, &flags)) {
            if ((flags & kSCNetworkReachabilityFlagsReachable) == 0)
            {
                // If target host is not reachable
                return NO;
            }

            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
                return YES;
            }


            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
                    return YES;
                }
            }

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

    return NO;
}

Dan iOS 5 diuji untuk Anda.

Andrew Zimmer
sumber
@JezenThomas Ini tidak melakukan pemeriksaan internet secara tidak sinkron, itulah sebabnya mengapa "jauh lebih ramping" ... Anda harus selalu melakukan ini secara tidak sinkron dengan berlangganan notifikasi sehingga Anda tidak menutup aplikasi pada proses ini.
iwasrobbed
Terima kasih, ini berfungsi bahkan jika Anda menggunakan wifi adsl dan adsl tidak terhubung, itulah yang saya butuhkan.
Williew
5
Memori bocor ini - struktur 'keterbacaan' (objek, benda) perlu dibebaskan dengan CFRelease ().
Russell Mull
@RussellMull ... tahu cara memperbaiki kebocoran?
i_raqz
Aneh bahwa jawaban ini mendahului jawaban saya (pada pertanyaan yang ditandai sebagai duplikat) pada 2 tahun, persis sama dengan jawaban saya, tetapi saya tidak pernah melihatnya sampai hari ini.
ArtOfWarfare
122

Ini digunakan untuk menjadi jawaban yang benar, tetapi sekarang sudah usang karena Anda harus berlangganan notifikasi untuk dapat dijangkau. Metode ini memeriksa secara sinkron:


Anda dapat menggunakan kelas Reachability Apple. Ini juga akan memungkinkan Anda untuk memeriksa apakah Wi-Fi diaktifkan:

Reachability* reachability = [Reachability sharedReachability];
[reachability setHostName:@"www.example.com"];    // Set your host name here
NetworkStatus remoteHostStatus = [reachability remoteHostStatus];

if (remoteHostStatus == NotReachable) { }
else if (remoteHostStatus == ReachableViaWiFiNetwork) { }
else if (remoteHostStatus == ReachableViaCarrierDataNetwork) { }

Kelas Reachability tidak dikirimkan bersama SDK, melainkan bagian dari aplikasi sampel Apple ini . Cukup unduh, dan salin Reachability.h / m ke proyek Anda. Anda juga harus menambahkan kerangka kerja SystemConfiguration ke proyek Anda.

Daniel Rinser
sumber
6
Lihat komentar saya di atas tentang tidak menggunakan Reachability seperti itu. Gunakan dalam mode asinkron dan berlangganan notifikasi yang dikirim - jangan.
Kendall Helmstetter Gelner
Kode ini adalah titik awal yang baik untuk hal-hal yang perlu Anda atur sebelum Anda dapat menggunakan metode delegasi untuk kelas jangkauan.
Brock Woolf
82

Inilah jawaban yang sangat sederhana:

NSURL *scriptUrl = [NSURL URLWithString:@"http://www.google.com/m"];
NSData *data = [NSData dataWithContentsOfURL:scriptUrl];
if (data)
    NSLog(@"Device is connected to the Internet");
else
    NSLog(@"Device is not connected to the Internet");

URL harus mengarah ke situs web yang sangat kecil. Saya menggunakan situs web seluler Google di sini, tetapi jika saya memiliki server web yang andal, saya akan mengunggah file kecil dengan hanya satu karakter di dalamnya untuk kecepatan maksimum.

Jika memeriksa apakah perangkat entah bagaimana terhubung ke Internet adalah segala sesuatu yang Anda ingin lakukan, saya pasti akan merekomendasikan menggunakan solusi sederhana ini. Jika Anda perlu tahu bagaimana pengguna terhubung, menggunakan Reachability adalah cara yang harus dilakukan.

Hati-hati: Ini secara singkat akan memblokir utas Anda saat memuat situs web. Dalam kasus saya, ini bukan masalah, tetapi Anda harus mempertimbangkan ini (memuji Brad karena menunjukkan ini).

Erik
sumber
10
Saya sangat menyukai ide ini, tetapi saya akan mengatakan untuk keandalan 99,999% sambil mempertahankan ukuran respons kecil, pergi dengan www.google.com/m yang merupakan tampilan mobile untuk google.
rwyland
1
Solusi luar biasa @Erik. Apa yang saya juga rekomendasikan kepada Anda adalah menggunakan www.google.com, alih-alih www.google.com/m, seperti kata rwyland. Aneh, tetapi dari pengujian saya, versi seluler selalu memakan waktu sekitar 120 ms lebih dari www.google.com
Sebyddd
4
Apple docs merekomendasikan untuk tidak melakukan ini karena dapat memblokir utas di jaringan yang lambat, dapat menyebabkan aplikasi dihentikan di iOS
Brad Thomas
Terima kasih atas umpan balik positif, setujui bahwa www.google.com/m adalah solusi terbaik karena keandalan!
Erik
3
LOL, saya yakin Google menghargai Anda menyarankan orang menggunakannya sebagai sumber daya pemeriksaan Internet.
mxcl
73

Inilah cara saya melakukannya di aplikasi saya: Walaupun 200 kode respons status tidak menjamin apa pun, itu cukup stabil untuk saya. Ini tidak memerlukan pemuatan sebanyak jawaban NSData yang diposting di sini, karena saya hanya memeriksa respons HEAD.

Tukar Kode

func checkInternet(flag:Bool, completionHandler:(internet:Bool) -> Void)
{
    UIApplication.sharedApplication().networkActivityIndicatorVisible = true

    let url = NSURL(string: "http://www.google.com/")
    let request = NSMutableURLRequest(URL: url!)

    request.HTTPMethod = "HEAD"
    request.cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringLocalAndRemoteCacheData
    request.timeoutInterval = 10.0

    NSURLConnection.sendAsynchronousRequest(request, queue:NSOperationQueue.mainQueue(), completionHandler:
    {(response: NSURLResponse!, data: NSData!, error: NSError!) -> Void in

        UIApplication.sharedApplication().networkActivityIndicatorVisible = false

        let rsp = response as! NSHTTPURLResponse?

        completionHandler(internet:rsp?.statusCode == 200)
    })
}

func yourMethod()
{
    self.checkInternet(false, completionHandler:
    {(internet:Bool) -> Void in

        if (internet)
        {
            // "Internet" aka Google URL reachable
        }
        else
        {
            // No "Internet" aka Google URL un-reachable
        }
    })
}

Kode Objektif-C

typedef void(^connection)(BOOL);

- (void)checkInternet:(connection)block
{
    NSURL *url = [NSURL URLWithString:@"http://www.google.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:self delegateQueue: [NSOperationQueue mainQueue]];

    NSURLSessionDataTask *dataTask = [defaultSession dataTaskWithRequest:headRequest
        completionHandler:^(NSData *data, NSURLResponse *response, NSError *error)
    {
        if (!error && response)
        {
            block([(NSHTTPURLResponse *)response statusCode] == 200);
        }
    }];
    [dataTask resume];
}

- (void)yourMethod
{
    [self checkInternet:^(BOOL internet)
    {
         if (internet)
         {
             // "Internet" aka Google URL reachable
         }
         else
         {
             // No "Internet" aka Google URL un-reachable
         }
    }];
}
klcjr89
sumber
3
Sepertinya ini adalah cara tercepat
Pavel
3
Perhatian: Dalam pengalaman saya, solusi ini tidak berfungsi sepanjang waktu. Dalam banyak kasus, respons yang dikembalikan adalah 403, setelah mengambil waktu yang manis. Solusi ini tampak sempurna, tetapi tidak menjamin hasil 100%.
Mustafa
10
Pada Juni 2014, ini akan gagal di daratan Cina, karena pemerintah China sekarang sepenuhnya memblokir google.com. (google.cn berfungsi, tetapi di daratan Cina, tidak ada baidu.com, tidak ada internet) Mungkin lebih baik untuk melakukan ping ke server apa pun yang Anda ingin berkomunikasi.
prewett
4
Gunakan www.appleiphonecell.com sebagai gantinya - apple membuat url ini karena alasan ini.
Smikey
1
Saya menggunakan appleiphonecell karena itu milik Apple, dapat digunakan di China juga, dan ini adalah situs web yang sangat cepat. Ini, bersamaan dengan jawaban Anda memberi saya solusi terdekat dan tercepat. Terima kasih
Septronic
57

Apple memasok kode sampel untuk memeriksa berbagai jenis ketersediaan jaringan. Atau ada contoh dalam buku masak pengembang iPhone.

Catatan: Silakan lihat komentar @ KHG pada jawaban ini mengenai penggunaan kode keterjangkauan Apple.

teh celup
sumber
Terima kasih. Saya menemukan bahwa dokumentasi Xcode di 3.0 juga berisi kode sumber, ditemukan dengan mencari "reachability" dalam dokumentasi.
Brock Woolf
7
Perhatikan bahwa revisi baru (09-08-09) dari kode sampel Reachability dari Apple tidak sinkron.
Daniel Hepper
46

Anda dapat menggunakan Reachabilitydengan  ( tersedia di sini ).

#import "Reachability.h"

- (BOOL)networkConnection {
    return [[Reachability reachabilityWithHostName:@"www.google.com"] currentReachabilityStatus];
}

if ([self networkConnection] == NotReachable) { /* No Network */ } else { /* Network */ } //Use ReachableViaWiFi / ReachableViaWWAN to get the type of connection.
Aleksander Azizi
sumber
@ Supertecnoboff Tidak, ini async.
Aleksander Azizi
39

Apple menyediakan contoh aplikasi yang melakukan hal ini:

Tingkat keterjangkauan

NANNAV
sumber
7
Anda harus mencatat bahwa sampel Reachability hanya mendeteksi antarmuka mana yang aktif, tetapi tidak yang memiliki koneksi yang valid ke internet. Aplikasi harus dengan anggun menangani kegagalan bahkan ketika Reachability melaporkan bahwa semuanya sudah siap.
rpetrich
Untungnya situasinya jauh lebih baik di 3.0, karena sistem akan menyajikan halaman login untuk pengguna di belakang WiFi yang terkunci di mana Anda harus login untuk menggunakan ... Anda harus memeriksa redirect secara manual (dan Anda masih melakukannya jika mengembangkan aplikasi 2.2.1)
Kendall Helmstetter Gelner
Saya tidak akan mengatakan bahwa aplikasi Reachability melakukan persis apa yang diminta. Namun itu adalah titik awal yang baik untuk menambahkan jenis fungsi yang diminta,
Johan Karlsson
Tautan rusak!, Akan sangat menghargai jika ini dapat diperiksa / diperbaiki, terima kasih banyak
Heider Sati
33

Hanya kelas Reachability yang diperbarui. Anda sekarang dapat menggunakan:

Reachability* reachability = [Reachability reachabilityWithHostName:@"www.apple.com"];
NetworkStatus remoteHostStatus = [reachability currentReachabilityStatus];

if (remoteHostStatus == NotReachable) { NSLog(@"not reachable");}
else if (remoteHostStatus == ReachableViaWWAN) { NSLog(@"reachable via wwan");}
else if (remoteHostStatus == ReachableViaWiFi) { NSLog(@"reachable via wifi");}
Ben Groot
sumber
1
Kecuali ada sesuatu yang berubah sejak 4.0 dirilis, kode itu tidak sinkron dan Anda dijamin melihatnya muncul di Crash Reports - terjadi pada saya sebelumnya.
bpapa
1
Saya setuju dengan bpapa. Bukan ide yang baik untuk menggunakan kode sinkron. Terima kasih atas informasinya
Brock Woolf
25

Ada modernisasi Reachability menggunakan ARC dan GCD yang terlihat bagus di sini:

Tingkat keterjangkauan

JK Laiho
sumber
22

Jika Anda menggunakan, AFNetworkingAnda dapat menggunakan implementasinya sendiri untuk status jangkauan internet.

Cara terbaik untuk digunakan AFNetworkingadalah dengan subklasAFHTTPClient kelas dan menggunakan kelas ini untuk melakukan koneksi jaringan Anda.

Salah satu keuntungan menggunakan pendekatan ini adalah Anda dapat menggunakan blocksuntuk mengatur perilaku yang diinginkan ketika status jangkauan dapat berubah. Andaikan saya membuat subclass singleton AFHTTPClient(seperti yang dikatakan pada "Subclassing notes" pada dokumen AFNetworking ) bernama BKHTTPClient, saya akan melakukan sesuatu seperti:

BKHTTPClient *httpClient = [BKHTTPClient sharedClient];
[httpClient setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status)
{
    if (status == AFNetworkReachabilityStatusNotReachable) 
    {
    // Not reachable
    }
    else
    {
        // Reachable
    }
}];

Anda juga dapat memeriksa koneksi Wi-Fi atau WLAN secara khusus menggunakan AFNetworkReachabilityStatusReachableViaWWANdanAFNetworkReachabilityStatusReachableViaWiFi enum ( selengkapnya di sini ).

Bruno Koga
sumber
18

Saya telah menggunakan kode dalam diskusi ini , dan sepertinya berfungsi dengan baik (baca keseluruhannya utasnya!).

Saya belum mengujinya secara mendalam dengan segala jenis koneksi yang mungkin (seperti Wi-Fi ad hoc).

Felixyz
sumber
kode ini tidak sepenuhnya baik karena hanya memeriksa untuk melihat apakah Anda memiliki koneksi wifi dengan router, tidak jika web dapat dijangkau. Anda dapat mengaktifkan wifi dan terus mengaktifkan untuk mencapai web.
DuckDucking
15

Sangat sederhana .... Coba langkah-langkah ini:

Langkah 1: Tambahkan SystemConfigurationkerangka kerja ke dalam proyek Anda.


Langkah 2: Impor kode berikut ke headerfile Anda .

#import <SystemConfiguration/SystemConfiguration.h>

Langkah 3: Gunakan metode berikut

  • Tipe 1:

    - (BOOL) currentNetworkStatus {
        [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
        BOOL connected;
        BOOL isConnected;
        const char *host = "www.apple.com";
        SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithName(NULL, host);
        SCNetworkReachabilityFlags flags;
        connected = SCNetworkReachabilityGetFlags(reachability, &flags);
        isConnected = NO;
        isConnected = connected && (flags & kSCNetworkFlagsReachable) && !(flags & kSCNetworkFlagsConnectionRequired);
        CFRelease(reachability);
        return isConnected;
    }

  • Tipe 2:

    Impor header :#import "Reachability.h"

    - (BOOL)currentNetworkStatus
    {
        Reachability *reachability = [Reachability reachabilityForInternetConnection];
        NetworkStatus networkStatus = [reachability currentReachabilityStatus];
        return networkStatus != NotReachable;
    }

Langkah 4: Cara menggunakan:

- (void)CheckInternet
{
    BOOL network = [self currentNetworkStatus];
    if (network)
    {
        NSLog(@"Network Available");
    }
    else
    {
        NSLog(@"No Network Available");
    }
}
Rajesh Loganathan
sumber
Apakah tipe 1 tidak sinkron?
Supertecnoboff
Saya ingin perbaikan tipe 2 dari jawaban Anda. Saya telah menambahkan kelas jangkauan dan saya mencoba memeriksa verifikasi koneksi dengan menggunakan jawaban Anda di atas. itu selalu terjangkau bahkan jika saya terhubung dengan WiFi tetapi tidak memiliki koneksi internet. WiFi tidak berarti memiliki koneksi internet. Saya ingin memverifikasi koneksi internet walaupun memiliki konektivitas WiFi. Bisakah Anda membantu saya?
wesley
12
-(void)newtworkType {

 NSArray *subviews = [[[[UIApplication sharedApplication] valueForKey:@"statusBar"] valueForKey:@"foregroundView"]subviews];
NSNumber *dataNetworkItemView = nil;

for (id subview in subviews) {
    if([subview isKindOfClass:[NSClassFromString(@"UIStatusBarDataNetworkItemView") class]]) {
        dataNetworkItemView = subview;
        break;
    }
}


switch ([[dataNetworkItemView valueForKey:@"dataNetworkType"]integerValue]) {
    case 0:
        NSLog(@"No wifi or cellular");
        break;

    case 1:
        NSLog(@"2G");
        break;

    case 2:
        NSLog(@"3G");
        break;

    case 3:
        NSLog(@"4G");
        break;

    case 4:
        NSLog(@"LTE");
        break;

    case 5:
        NSLog(@"Wifi");
        break;


    default:
        break;
}
}
Mutawe
sumber
7
Bahkan jika perangkat terhubung ke Wifi atau jenis jaringan lain, koneksi internet masih tidak tersedia. Tes sederhana: sambungkan ke wifi rumah Anda dan cabut modem kabel Anda. Masih terhubung ke wifi, tetapi nol internet.
iwasrobbed
11
- (void)viewWillAppear:(BOOL)animated
{
    NSString *URL = [NSString stringWithContentsOfURL:[NSURL URLWithString:@"http://www.google.com"]];

    return (URL != NULL ) ? YES : NO;
}

Atau gunakan kelas Reachability .

Ada dua cara untuk memeriksa ketersediaan Internet menggunakan iPhone SDK:

1. Periksa halaman Google dibuka atau tidak.

2. Kelas Jangkauan

Untuk informasi lebih lanjut, silakan merujuk ke Reachability (Pengembang Apple).

IOS Rocks
sumber
1
Ada dua cara untuk memeriksa ketersediaan internet di iPhone SDK 1) Periksa halaman Google dibuka atau tidak.
IOS Rocks
1
-1: Ini adalah metode sinkron yang akan memblokir utas utama (salah satu yang diubah UI aplikasi) saat mencoba menyambung ke google.com. Jika pengguna Anda pada koneksi data yang sangat lambat, ponsel akan bertindak seolah-olah prosesnya tidak responsif.
iwasrobbed
10

Pertama : Tambahkan CFNetwork.frameworkkerangka kerja

Kode :ViewController.m

#import "Reachability.h"

- (void)viewWillAppear:(BOOL)animated
{
    Reachability *r = [Reachability reachabilityWithHostName:@"www.google.com"];
    NetworkStatus internetStatus = [r currentReachabilityStatus];

    if ((internetStatus != ReachableViaWiFi) && (internetStatus != ReachableViaWWAN))
    {
        /// Create an alert if connection doesn't work
        UIAlertView *myAlert = [[UIAlertView alloc]initWithTitle:@"No Internet Connection"   message:NSLocalizedString(@"InternetMessage", nil)delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil];
        [myAlert show];
        [myAlert release];
    }
    else
    {
         NSLog(@"INTERNET IS CONNECT");
    }
}
Paresh Hirpara
sumber
8

Pertama-tama unduh kelas reachability dan letakkan file reachability.h dan reachabilty.m di Xcode Anda .

Cara terbaik adalah membuat kelas Fungsi umum (NSObject) sehingga Anda dapat menggunakannya di kelas mana saja. Ini adalah dua metode untuk pemeriksaan jangkauan jangkauan koneksi jaringan:

+(BOOL) reachabiltyCheck
{
    NSLog(@"reachabiltyCheck");
    BOOL status =YES;
    [[NSNotificationCenter defaultCenter] addObserver:self
                                          selector:@selector(reachabilityChanged:)
                                          name:kReachabilityChangedNotification
                                          object:nil];
    Reachability * reach = [Reachability reachabilityForInternetConnection];
    NSLog(@"status : %d",[reach currentReachabilityStatus]);
    if([reach currentReachabilityStatus]==0)
    {
        status = NO;
        NSLog(@"network not connected");
    }
    reach.reachableBlock = ^(Reachability * reachability)
    {
        dispatch_async(dispatch_get_main_queue(), ^{
        });
    };
    reach.unreachableBlock = ^(Reachability * reachability)
    {
        dispatch_async(dispatch_get_main_queue(), ^{
        });
    };
    [reach startNotifier];
    return status;
}

+(BOOL)reachabilityChanged:(NSNotification*)note
{
    BOOL status =YES;
    NSLog(@"reachabilityChanged");
    Reachability * reach = [note object];
    NetworkStatus netStatus = [reach currentReachabilityStatus];
    switch (netStatus)
    {
        case NotReachable:
            {
                status = NO;
                NSLog(@"Not Reachable");
            }
            break;

        default:
            {
                if (!isSyncingReportPulseFlag)
                {
                    status = YES;
                    isSyncingReportPulseFlag = TRUE;
                    [DatabaseHandler checkForFailedReportStatusAndReSync];
                }
            }
            break;
    }
    return status;
}

+ (BOOL) connectedToNetwork
{
    // Create zero addy
    struct sockaddr_in zeroAddress;
    bzero(&zeroAddress, sizeof(zeroAddress));
    zeroAddress.sin_len = sizeof(zeroAddress);
    zeroAddress.sin_family = AF_INET;

    // Recover reachability flags
    SCNetworkReachabilityRef defaultRouteReachability = SCNetworkReachabilityCreateWithAddress(NULL, (struct sockaddr *)&zeroAddress);
    SCNetworkReachabilityFlags flags;
    BOOL didRetrieveFlags = SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags);
    CFRelease(defaultRouteReachability);
    if (!didRetrieveFlags)
    {
        NSLog(@"Error. Could not recover network reachability flags");
        return NO;
    }
    BOOL isReachable = flags & kSCNetworkFlagsReachable;
    BOOL needsConnection = flags & kSCNetworkFlagsConnectionRequired;
    BOOL nonWiFi = flags & kSCNetworkReachabilityFlagsTransientConnection;
    NSURL *testURL = [NSURL URLWithString:@"http://www.apple.com/"];
    NSURLRequest *testRequest = [NSURLRequest requestWithURL:testURL  cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:20.0];
    NSURLConnection *testConnection = [[NSURLConnection alloc] initWithRequest:testRequest delegate:self];
    return ((isReachable && !needsConnection) || nonWiFi) ? (testConnection ? YES : NO) : NO;
}

Sekarang Anda dapat memeriksa koneksi jaringan di kelas mana pun dengan memanggil metode kelas ini.

Latika Tiwari
sumber
8

Ada juga metode lain untuk memeriksa koneksi Internet menggunakan iPhone SDK.

Cobalah untuk menerapkan kode berikut untuk koneksi jaringan.

#import <SystemConfiguration/SystemConfiguration.h>
#include <netdb.h>

/**
     Checking for network availability. It returns
     YES if the network is available.
*/
+ (BOOL) connectedToNetwork
{

    // Create zero addy
    struct sockaddr_in zeroAddress;
    bzero(&zeroAddress, sizeof(zeroAddress));
    zeroAddress.sin_len = sizeof(zeroAddress);
    zeroAddress.sin_family = AF_INET;

    // Recover reachability flags
    SCNetworkReachabilityRef defaultRouteReachability =
        SCNetworkReachabilityCreateWithAddress(NULL, (struct sockaddr *)&zeroAddress);
    SCNetworkReachabilityFlags flags;

    BOOL didRetrieveFlags = SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags);
    CFRelease(defaultRouteReachability);

    if (!didRetrieveFlags)
    {
        printf("Error. Could not recover network reachability flags\n");
        return NO;
    }

    BOOL isReachable = ((flags & kSCNetworkFlagsReachable) != 0);
    BOOL needsConnection = ((flags & kSCNetworkFlagsConnectionRequired) != 0);

    return (isReachable && !needsConnection) ? YES : NO;
}
Sahil Mahajan
sumber
8
  1. Unduh file Reachability, https://gist.github.com/darkseed/1182373

  2. Dan tambahkan CFNetwork.frameworkdan 'SystemConfiguration.framework' dalam framework

  3. Lakukan # impor "Reachability.h"


Pertama : TambahCFNetwork.frameworkkerangka kerja

Kode :ViewController.m

- (void)viewWillAppear:(BOOL)animated
{
    Reachability *r = [Reachability reachabilityWithHostName:@"www.google.com"];
    NetworkStatus internetStatus = [r currentReachabilityStatus];

    if ((internetStatus != ReachableViaWiFi) && (internetStatus != ReachableViaWWAN))
    {
        /// Create an alert if connection doesn't work
        UIAlertView *myAlert = [[UIAlertView alloc]initWithTitle:@"No Internet Connection"   message:NSLocalizedString(@"InternetMessage", nil)delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil];
        [myAlert show];
        [myAlert release];
    }
    else
    {
         NSLog(@"INTERNET IS CONNECT");
    }
}
Maulik Salvi
sumber
8

Swift 3 / Swift 4

Anda harus terlebih dahulu mengimpor

import SystemConfiguration

Anda dapat memeriksa koneksi internet dengan metode berikut

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)

}
Devang Tandel
sumber
7

Kelas Reachability OK untuk mengetahui apakah koneksi Internet tersedia untuk perangkat atau tidak ...

Tetapi dalam hal mengakses sumber daya intranet :

Ping server intranet dengan kelas reachability selalu mengembalikan true.

Jadi solusi cepat dalam skenario ini adalah membuat metode web yang disebut pingmebersama dengan metode web lainnya pada layanan. The pingmeharus kembali sesuatu.

Jadi saya menulis metode berikut pada fungsi-fungsi umum

-(BOOL)PingServiceServer
{
    NSURL *url=[NSURL URLWithString:@"http://www.serveraddress/service.asmx/Ping"];

    NSMutableURLRequest *urlReq=[NSMutableURLRequest requestWithURL:url];

    [urlReq setTimeoutInterval:10];

    NSURLResponse *response;

    NSError *error = nil;

    NSData *receivedData = [NSURLConnection sendSynchronousRequest:urlReq
                                                 returningResponse:&response
                                                             error:&error];
    NSLog(@"receivedData:%@",receivedData);

    if (receivedData !=nil)
    {
        return YES;
    }
    else
    {
        NSLog(@"Data is null");
        return NO;
    }
}

Metode di atas sangat berguna bagi saya, jadi setiap kali saya mencoba mengirim beberapa data ke server, saya selalu memeriksa keterjangkauan sumber daya intranet saya menggunakan URLRequest timeout rendah ini.

Durai Amuthan.H
sumber
7

Untuk melakukan ini sendiri sangat sederhana. Metode berikut akan berhasil. Pastikan untuk tidak mengizinkan protokol nama host seperti HTTP, HTTPS, dll. Diteruskan dengan namanya.

-(BOOL)hasInternetConnection:(NSString*)urlAddress
{
    SCNetworkReachabilityRef ref = SCNetworkReachabilityCreateWithName(kCFAllocatorDefault, [urlAddress UTF8String]);
    SCNetworkReachabilityFlags flags;
    if (!SCNetworkReachabilityGetFlags(ref, &flags))
    {
        return NO;
    }
    return flags & kSCNetworkReachabilityFlagsReachable;
}

Cepat dan tidak menyakitkan.

Tony
sumber
7

Saya pikir ini adalah jawaban terbaik.

"Ya" berarti terhubung. "Tidak" berarti terputus.

#import "Reachability.h"

 - (BOOL)canAccessInternet
{
    Reachability *IsReachable = [Reachability reachabilityForInternetConnection];
    NetworkStatus internetStats = [IsReachable currentReachabilityStatus];

    if (internetStats == NotReachable)
    {
        return NO;
    }
    else
    {
        return YES;
    }
}
Mina Fawzy
sumber
6

Impor Reachable.hkelas di Anda ViewController, dan gunakan kode berikut untuk memeriksa konektivitas :

     #define hasInternetConnection [[Reachability reachabilityForInternetConnection] isReachable]
     if (hasInternetConnection){
           // To-do block
     }
Himanshu Mahajan
sumber
Jawaban Anda persis seperti yang saya cari. Anda berhak mendapatkan suara xD
Nikel Arteta
Tidak berfungsi jika Anda terhubung ke WiFi tanpa internet.
Keselme
6
  • Langkah 1: Tambahkan kelas Reachability di Proyek Anda.
  • Langkah 2: Impor kelas Reachability
  • Langkah 3: Buat fungsi di bawah ini

    - (BOOL)checkNetConnection {
        self.internetReachability = [Reachability reachabilityForInternetConnection];
        [self.internetReachability startNotifier];
        NetworkStatus netStatus = [self.internetReachability currentReachabilityStatus];
        switch (netStatus) {
            case NotReachable:
            {
                return NO;
            }
    
            case ReachableViaWWAN:
            {
                 return YES;
            }
    
            case ReachableViaWiFi:
            {
                 return YES;
            }
        }
    }
  • Langkah 4: Panggil fungsi seperti di bawah ini:

    if (![self checkNetConnection]) {
        [GlobalFunctions showAlert:@""
                         message:@"Please connect to the Internet!"
                         canBtntitle:nil
                         otherBtnTitle:@"Ok"];
        return;
    }
    else
    {
        Log.v("internet is connected","ok");
    }
Anny
sumber
Dokumen Apple menyatakan Catatan
noobsmcgoobs