2009-08-15 15 views
8

मैंने खोज की है लेकिन एक समान प्रश्न नहीं देख सकता है।पहुंचने योग्यता कभी-कभी विफल होती है, भले ही हमारे पास इंटरनेट कनेक्शन हो,

मैंने रीचैबिलिटी उदाहरण के अनुसार इंटरनेट कनेक्शन की जांच करने के लिए एक विधि जोड़ा है। यह ज्यादातर समय काम करता है, लेकिन जब आईफोन पर स्थापित किया जाता है, तब भी जब मैं इंटरनेट कनेक्टिविटी करता हूं तब भी यह असफल रहता है (केवल 3 जी/ईडीजीई पर - वाईफाई ठीक है)।

मूल रूप से नीचे दिया गया कोड NO।

यदि मैं किसी अन्य ऐप पर स्विच करता हूं, तो मेल या सफारी कहें, और कनेक्ट करें, फिर ऐप पर वापस स्विच करें, फिर कोड कहता है कि इंटरनेट पहुंच योग्य है। किंडा ऐसा लगता है कि इसे 'नज' की जरूरत है।

किसी ने इसे पहले देखा है? कोई विचार?

बहुत धन्यवाद जेम्स

+ (BOOL) doWeHaveInternetConnection{ 

BOOL success; 
// google should always be up right?! 
const char *host_name = [@"google.com" cStringUsingEncoding:NSASCIIStringEncoding]; 

SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithName(NULL, 
                      host_name); 
SCNetworkReachabilityFlags flags; 
success = SCNetworkReachabilityGetFlags(reachability, &flags); 
BOOL isAvailable = success && (flags & kSCNetworkFlagsReachable) && !(flags & kSCNetworkFlagsConnectionRequired); 

if (isAvailable) { 
    NSLog(@"Google is reachable: %d", flags); 
}else{ 
    NSLog(@"Google is unreachable"); 
} 

return isAvailable; 

}

उत्तर

7

ऐसा लगता है कि एप्पल उदाहरण कोड से कुछ बुनियादी गम्यता कोड बाहर छीन लिया है। क्या होता है जब आप इसे बरकरार रखते हैं और ऐसा करते हैं?

Reachability *hostReach = [[Reachability reachabilityWithHostName: @"www.apple.com"] retain]; 

NetworkStatus netStatus = [hostReach currentReachabilityStatus]; 

if (netStatus == NotReachable) 
{ 
    NSLog(@"NotReachable"); 
} 

if (netStatus == ReachableViaWiFi) 
{ 
    NSLog(@"ReachableViaWiFi"); 
} 

if (netStatus == ReachableViaWWAN) 
{ 
    NSLog(@"ReachableViaWWAN"); 
} 
+0

माफी, मैं एक नोब का हूँ। मैंने अपने प्रोजेक्ट में रीचैबिलिटी क्लासेस का उदाहरण जोड़ा, लेकिन संकलित नहीं कर सकता। \t पहुंच योग्यता * hostReach = [[पहुंच योग्यता पहुंच योग्यताथोस्टनाम: @ "www.apple.com"] बनाए रखें]; काम नहीं करता है। पहुंचने योग्य विधि WithHostName विधि नहीं मिल रहा है। मैं फेरबदल करते रहेंगे ... – stoutyhk

+0

इस काम करता है: + (bool) doWeHaveInternetConnection2 { \t \t अगर ([[गम्यता sharedReachability] internetConnectionStatus] == NotReachable) { \t \t वापसी नहीं; \t} \t बाकी \t { \t \t वापसी हाँ; \t} \t } – stoutyhk

+1

वह कोड हमेशा आपको कनेक्ट नहीं होने पर "कनेक्ट नहीं किया गया" देता है। लेकिन एक बार जब यह "पहुंचने योग्यता" विधि पर जाता है तो यह आपको सही स्थिति देता है।तो पहली जगह सही स्थिति कैसे प्राप्त करें? – Nnp

1
+ (BOOL) doWeHaveInternetConnection2{ 
     if([[Reachability sharedReachability] internetConnectionStatus] == NotReachable) { 
        return NO; 
      } 
      else 
      { 
        return YES; 
      } 

} 

संस्करण 2 के साथ (क्षमा करें, कोड प्रारूप टिप्पणी में काम नहीं किया)

+0

'साझा रीचैबिलिटी 'के लिए कॉल मुझे बताता है कि आप रीचैबिलिटी के प्री-2.0 संस्करण का उपयोग कर रहे हैं। नवीनतम संस्करण एक सप्ताह या उससे पहले पोस्ट किया गया था, और यह एक सिंगलटन का उपयोग करने वाले व्यक्ति से बहुत बेहतर काम करता है। नीचे मैट का जवाब नवीनतम संस्करण पर आधारित है, यही कारण है कि आपको इसे संकलित करने में परेशानी हो रही थी। नवीनतम संस्करण प्राप्त करें और देखें कि क्या यह आपकी आवश्यकताओं को बेहतर बनाता है। – Tim

+0

धन्यवाद - पता नहीं था कि एक नया संस्करण था। बहुत धन्यवाद। – stoutyhk

1

, कोड होना चाहिए:

+ (BOOL) doWeHaveInternetConnection2{ 

if([Reachability reachabilityForInternetConnection] == NotReachable) { 
    return NO; 
} 
else 
{ 
    return YES; 
} 

}

+0

// accessabilityForInternetConnection- यह जांचता है कि डिफ़ॉल्ट मार्ग उपलब्ध है या नहीं। // उन अनुप्रयोगों द्वारा उपयोग किया जाना चाहिए जो किसी विशेष होस्ट से कनेक्ट नहीं होते हैं – stoutyhk

+0

इस डिवाइस को, आईफोन डिवाइस पर, हवाई जहाज मोड में परीक्षण करते हुए, इस कोड ने एक हाँ वापस कर दिया, लेकिन फिर एक यूआरएल पुनर्प्राप्त करते समय, यह असफल रहा। तो मैं इसका उपयोग नहीं करता। किसी विशेष होस्ट से कनेक्शन जांचने के लिए वापस जा रहे हैं। – stoutyhk

+0

पहुंच योग्यता का उपयोग करके किसी विशेष होस्ट से कनेक्शन का परीक्षण करनाथहोस्टनाम एक झूठी सकारात्मक लौटाएगा, जाहिर है कि जब भी आपके फोन को आईपी पता सौंपा गया हो। इसे आज़माएं: अपने वायरलेस राउटर से केबल को अनप्लग करें, जबकि आपका फोन उससे जुड़ा हुआ है, और [पहुंच योग्यता पहुंचने योग्यताथोस्टनाम:] का नतीजा देखें: यह हर बार हाँ होगा, भले ही आप स्पष्ट रूप से मेजबान तक नहीं पहुंच सकें। – Oscar

1

मैं क्या पाया है यह है कि आपको पता होना चाहिए कि थ्रेड (रनलोप) जिसमें से आप पहले startNotifier पर कॉल करते हैं। यदि आप इसे पृष्ठभूमि थ्रेड या NSOperation से कॉल करते हैं, तो आप उस थ्रेड के रन लूप पर नोटिफ़ायर लूप शुरू करेंगे।

यदि आप उदाहरण साझा करते हैं, तो [Reachability reachabilityForInternetConnection] में एक सिंगलटन को पकड़ना, यह वर्तमान कोड (2.0) से दिखाई देता है कि अंतिम चालक जीतता है और नोटिफ़ायर को अपने रन लूप पर सेट करता है।

संबंधित मुद्दे

 संबंधित मुद्दे