2009-04-06 13 views
5

रीचबिलिटी नामक ऐप्पल का नमूना ऐप दिखाता है कि कनेक्शन का पता कैसे लगाया जाए। आप केवल वाईफाई नहीं बल्कि इंटरनेट, नीचे दूसरी पंक्ति पर एक मिनट से अधिक के लिए app स्टालों है:रीचैबिलिटी नमूना ऐप यहां क्यों रुकता है?

SCNetworkReachabilityFlags reachabilityFlags; 
BOOL gotFlags = SCNetworkReachabilityGetFlags(reachabilityRef, &reachabilityFlags); 

SCNetworkReachabilityGetFlags SystemConfiguration.framework से आता है। इस बारे में कोई सुझाव कैसे है?

उत्तर

6

सीधे अपने प्रश्न का उत्तर देने के लिए, नहीं, एससीनेटवर्क रीचैबिलिटी गेटफ्लैग्स() को आपके द्वारा वर्णित विशिष्ट परिस्थितियों में लौटने के लिए काफी समय लगने का कोई तरीका नहीं लगता है (उदाहरण के लिए, वाईफाई के माध्यम से रिमोट होस्ट पहुंच योग्यता की जांच करना बिना इंटरनेट के राउटर से कनेक्शन)। कुछ विकल्प:

विकल्प 1. कॉल को एक अलग थ्रेड में बनाएं ताकि आपका शेष ऐप चल रहा हो। ReachabilityAppDelegate.m संशोधित रूप में एक उदाहरण के लिए इस प्रकार है:

// Modified version of existing "updateStatus" method 
- (void)updateStatus 
{ 
    // Query the SystemConfiguration framework for the state of the device's network connections. 
    //self.remoteHostStatus   = [[Reachability sharedReachability] remoteHostStatus]; 
    self.remoteHostStatus = -1; 
    self.internetConnectionStatus = [[Reachability sharedReachability] internetConnectionStatus]; 
    self.localWiFiConnectionStatus = [[Reachability sharedReachability] localWiFiConnectionStatus]; 
    [tableView reloadData]; 

    // Check remote host status in a separate thread so that the UI won't hang 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    NSTimer *timer = [NSTimer timerWithTimeInterval:0 target:self selector:@selector(updateRemoteHostStatus) userInfo:nil repeats:NO]; 
    [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode]; 
    [pool release]; 
} 
// New method 
- (void) updateRemoteHostStatus 
{ 
    self.remoteHostStatus = [[Reachability sharedReachability] remoteHostStatus]; 
    [tableView reloadData]; 
} 

विकल्प 2. एक अलग एपीआई/समारोह जब दूरस्थ होस्ट से कनेक्ट करने का प्रयास एक टाइमआउट मान का उपयोग करता है का उपयोग करें। इस तरह आपका ऐप केवल छोड़ने से पहले एक्स सेकंड के लिए लटका होगा।

कुछ अन्य बातें ध्यान रखें:

  • SCNetworkReachabilityGetFlags() है कि आप के बारे में (यानी, लाइन ~ 399 Reachability.m में) को देखने के लिए कोशिश कर रहा है पूछ रहे हैं के लिए विशिष्ट कॉल करता है, तो www.apple.com यदि "बाहरी इंटरनेट" सामान्य रूप से "पहुंच योग्य" है तो कटौती करने के लिए "पहुंच योग्य" है।
  • ऐप्पल के सिस्टम में कॉन्फ़िगर फ्रेमवर्क "पहुंचने योग्य" का अर्थ यह नहीं हो सकता कि आप क्या सोचते हैं। आधिकारिक दस्तावेज़ों के मुताबिक, "पहुंचने योग्य" का अर्थ यह है कि, सिद्धांत रूप में, आपका कंप्यूटर होस्ट एक्स से कनेक्ट हो सकता है, लेकिन इसे वास्तव में पहले कनेक्शन स्थापित करना पड़ सकता है (उदाहरण के लिए, पहले मॉडेम डायल करें)। दूसरे शब्दों में, SCNetworkReachabilityGetFlags() वास्तव में एक कनेक्शन स्थापित नहीं करता है।
+0

धन्यवाद। मैं टाइमआउट कैसे बना सकता हूं ताकि टाइमआउट अंतराल पर हिट होने पर कॉल कॉल पर वापस आ जाए? यदि UIWebViewDelegate :: webViewDidFinishLoad को टाइमआउट अंतराल से पहले बुलाया जाता है, तो मैं टाइमआउट रद्द कर सकता हूं। – 4thSpace

+0

एनएसटीमर के शेड्यूल टाइमर विथटाइम इंटरवल: विधि पर एक नज़र डालें। आप वर्तमान थ्रेड में टाइमर बना सकते हैं, उदाहरण के लिए, 5 सेकंड के बाद कुछ विधि निष्पादित करता है। यह तरीका यह देखने के लिए जांच सकता है कि क्या SCNetworkReachabilityGetFlags() समाप्त हो गया है, और यदि ऐसा नहीं है, तो अपना टाइमआउट तर्क चलाएं। –

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