2012-11-16 16 views
10

Apple'ın yeniden kullanılabilirlik kodunu kullanıyorum ve ağ erişilebilirliği değiştiğinde ve sunucu bağlantısı başlatmadan önce ilk bildirimleri ayarlıyorum. Kod, wi-fi'deyken çalışır ve wi-fi erişim noktasını kapatırım. Ancak, wi-fi ve temel geniş bant bağlantısı ile uygulamayı başlattığımda, ve daha sonra uygulama çalışırken ve sonra Wi-Fi yönlendirici geniş bant yönlendirici (örneğin Wi-Fi açık ama internet yok bağlantı) ve ben bir ulaşılabilirlik kontrolü yapmak, aldığım ağ durumu ReachableViaWiFi olduğunu. Her iki reachabilityForInternetConnection ve erişilebilirlikWithHostName denedim.Kablosuz bağlantı kurulduğunda, ancak İnternet yokken erişilebilirlik çalışmaz

Apple'ın ulaşılabilirlik kodu, wifi'nin bağlı olduğu bir durumu algılamak için kullanılabilir, ancak temel ağ bağlantısı bulunmuyor mu?

Teşekkürler!

cevap

5

tamam, bunun cevabını buldum - Apple'ın ulaşılabilirliği ana bilgisayara gerçek bağlantıyı sınamayacaktır. Aşağıdaki SO linkte @Zhami tarafından cevap bakınız: Uygulamayı ilk ve ulaşılabilirlik kontrolü yapmak zaman

How to write a simple Ping method in Cocoa/Objective-C

Esasen, iOS bir DNS araması yapmak görünüyor ve internet yok ise, Çek başarısız olur. Böylece, ilk kez okunabilirliği kontrol ettiğinizde, aslında anlamlı bir değer döndürür. Bununla birlikte, uygulama başlamasına bağlıysanız ve bir süre sonra İnternet bağlantınızı kaybederseniz (hala WiFi/3G/4G'ye bağlıyken, ancak temel internet bağlantınız olmasa da), İnternet veya belirlediğiniz ana bilgisayara ulaşılamıyor olsa bile daha fazla ulaşılabilirlik kontrolleri geri dönebilir. artık.

Yani gerçekten gerçek zamanlı olarak bağlantı için kontrol etmek istiyorsanız, aşağıdaki kullanmayı düşünün:

-(BOOL) isConnected 
{ 

    NSString* url = [NSURL URLWithString:@"http://www.google.com/m"]; 
    ASIHTTPRequest* request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:url]]; 
    [request setTimeOutSeconds:10]; 
//customize as per your needs - note this check is synchronous so you dont want to block the main thread for too long 
    [request setNumberOfTimesToRetryOnTimeout:0]; 
    [request startSynchronous]; 

    NSError *error = [request error]; 
    if (error) 
    { 
     DLog(@"connectivity error"); 
     return NO; 
    } 
    else 
    { 
     DLog(@"connectivity OK"); 
     return YES; 
    } 

} 
+0

bu işe yaramıyor ... – user3079872

+0

internet müsait olup olmadığını kontrol ettiğimde işe yarayacaktır. İnternet bağlantısı kesilirken, hemen internetin bulunmadığı bir durumu nasıl dinleyip gösterebilirim? – NandhaKumar

1

Bu çok eski bir yazı olduğunu, ancak başvuru için burada kalabilirim.

- (BOOL)startNotifier 
{ 
    BOOL returnValue = NO; 
    SCNetworkReachabilityContext context = {0, (__bridge void *)(self), NULL, NULL, NULL}; 

    if (SCNetworkReachabilitySetCallback(_reachabilityRef, ReachabilityCallback, &context)) 
    { 
     if (SCNetworkReachabilityScheduleWithRunLoop(_reachabilityRef, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode)) 
     { 
      returnValue = YES; 
     } 
    } 

    return returnValue; 
} 

Bu ağ değişikliklerine güncel _reachabilityRef tutacak: ulaşılabilirlik örneği sınıfında aşağıdaki kodu bulabilirsiniz.

İlgili konular