SORU
5 Temmuz 2009, Pazar


Nasıl iPhone SDK üzerinde etkin bir İnternet Bağlantısı için kontrol etmek?

Eğer iPhone üzerinde bir Internet bağlantısı Cocoa Touch kitaplıklarını kullanan var olmadığını görmek için kontrol etmek istiyorum.

Bu NSURL kullanarak bunu yapmak için bir yol buldum. Bu şekilde yaptım galiba biraz güvenilmez (çünkü Google bile bir gün aşağı ve güvenerek bir 3. parti gibi kötü) ve ben diye kontrol etmek için görmek için bir yanıttan başka web sitelerine Google cevap vermedi, öyle görünüyor savurgan ve gereksiz bir yükü benim uygulama.

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

Ne ben kötü yapmış? Bunu yapmanın daha iyi bir yolu nedir? (Eğer bahsetmiyorum bile stringWithContentsOfURL 3.0 önerilmiyor)

CEVAP
29 AĞUSTOS 2010, Pazar


YÖNTEM 1: yapmak (ARC ve GCD) uyumlu basit bir sınıfı Kullanın

1) proje SystemConfiguration çerçeve Ekle ama hiçbir yerde de dahil olmak üzere merak etmeyin

2) Ekle Milyon Tony proje için Reachability.h Reachability.m (burada bulundu: https://github.com/tonymillion/Reachability) sürümü

3) arayüz bölümüne Güncelleştirin

#import "Reachability.h"

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

4) Daha Sonra bu yöntemi uygulayın .m arayabilirsiniz görünümü denetleyicisi dosyası

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

YÖNTEM 2: kendi kendine, eski yol Apple'ın eski Erişilebilirlik sınıfı kullanarak

1) proje SystemConfiguration çerçeve Ekle ama hiçbir yerde de dahil olmak üzere merak etmeyin

2) proje (you can get those here) Reachability.h Reachability.m Apple'ın sürümü Ekleyin

3) @class Reachability; Ekleyin .h kodu uygulama olduğu dosya

4) interface bölümünde kontrol etmek için bir kaç örneğini Oluşturun .h dosyası:

Reachability* internetReachable;
Reachability* hostReachable;

5). bir yöntem Ekleyin ağ durum güncellemeleri için h:

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

6) #import "Reachability.h" Ekleyin .m kontrol uygulama dosya

7).check uygulama nerede, m dosyası, ilk yöntem (init viewWillAppear viewDidLoad vb.) birinde yer:

-(void) viewWillAppear:(BOOL)animated
{
    // check for internet connection
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(checkNetworkStatus:) name:kReachabilityChangedNotification object:nil];

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

    // check if a pathway to a random host exists
    hostReachable = [Reachability reachabilityWithHostName:@"www.apple.com"];
    [hostReachable startNotifier];

    // now patiently wait for the notification
}

8) bildirim ayarlamak ne olursa olsun ve ne olursa olsun Çek gönderdi set veya çağrı aldığında yöntemi (benim durumumda, ben sadece bir BOOL seti) Ayarlayın

-(void) checkNetworkStatus:(NSNotification *)notice
{
    // called after network status changes
    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;
        }
    }
}

9) dealloc viewWillDisappear veya benzeri bir yöntemi, bir gözlemci olarak kendinizi kaldırın

-(void) viewWillDisappear:(BOOL)animated
{
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

Bellek bir uyarı alırsınız bir örneği viewWillDisappear kullanarak olabilir ve gözlemci asla bunun için de hesap etmelisin bu kadar kayıtsız olur. not:


Not:Kullandığınız etki alanı önemli değil. Sadece herhangi bir etki alanı için bir ağ geçidi için bir test.

ÖNEMLİ NOT:Reachability sınıf projelerinde en çok kullanılan sınıflardan biri olduğunu ShareKit gibi diğer projelerle çakışmaları adlandırma olur. Eğer bu olursa, Reachability.h çiftlerinden biri yeniden adlandırmak olacak ve Reachability.m sorunu çözmek için başka bir şey için dosyaları.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Jonathan Morrison

    Jonathan Mor

    24 Mart 2010
  • KRQE

    KRQE

    6 AĞUSTOS 2007
  • Mark Brown

    Mark Brown

    9 HAZİRAN 2010