2016-02-25 10 views
5

मैं ऐप्पल से Reachability class का उपयोग कर रहा हूं ताकि नेटवर्क ऐप की कार्यक्षमता में पता चल सके जो मेरे ऐप की कार्यक्षमता में प्रभाव डालती है। यह एक वीओआईपी ऐप है जो setKeepAliveTimeout का उपयोग करता है, इसलिए प्रत्येक ~ 10 मिनट जागता है नेटवर्क की स्थिति को पढ़ता है और यह तय करता है कि कनेक्शन रीफ्रेश किया जाना चाहिए या नहीं।आईओएस रीचबिलिटी कोई वाईफाई रिपोर्ट नहीं करता है, जब वाईफाई सक्रिय होता है

BOOL res = [app setKeepAliveTimeout:600 handler:^{   
     [[WIFI instance] isWifiConnected]; 
     [[AClass an_instance] refresh]; 
    } 
}]; 

तो हर 10 मिनट में वाईफाई कनेक्ट किया जाता है और ऐप नेटवर्क स्थिति को फिर से पढ़ता है।

- (BOOL) isWifiConnected { 

    self.wifiReach = [Reachability reachabilityForLocalWiFi]; 
    NetworkStatus wifiStatus = [self.wifiReach currentReachabilityStatus]; 

    switch (wifiStatus) { 
     case NotReachable: { 
      m_wifiConnected = NO; 
      LOG(@"NetStatus:NotReachable"); 
      break; 
     } 
     case ReachableViaWiFi: { 
      m_wifiConnected = YES; 
      m_wwanConnected = NO; 
      LOG(@"NetStatus:ReachableViaWiFi"); 
      break; 
     } 
    } 
    return m_wifiConnected; 
} 

हालांकि मैं डिवाइस कॉल झूठी रिटर्न में वाईफ़ाई है, कोई WiFi यानी, और शुद्ध की स्थिति के लिए इसके अलावा NotReachable।

हालांकि बहुत कम समय अंतराल के बाद पहुंच क्षमता कॉलबैक को फिर से बुलाया जाता है और वाईफ़ाई कनेक्ट होता है। हालांकि, मैंने त्रुटि मान के कारण पहले से ही एक ईवेंट निकाल दिया है और ऐप सर्वर के साथ कनेक्शन बंद कर देता है कि कोई वाई-फाई नहीं है।

कुछ शोध यह मैं Reachability.m फ़ाइल (एप्पल से प्रदान की गई)

डिफ़ॉल्ट रूप से की रीडमी फ़ाइल में इस पाया कर, आवेदन अपने दूरस्थ होस्ट के लिए www.apple.com उपयोग करता है। आप VisualHostName वैरिएबल में -viewDidLoad में मान को संशोधित करके APLViewController.m में उपयोग किए गए होस्ट को बदल सकते हैं।

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

क्या यह समस्या हो सकती है? डीएनएस लुकअप में देरी? या क्या मुझे अपना कोड भी बढ़ाने की ज़रूरत है?

मैं अनुप्रयोग प्रारंभ जब मैं इस

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

फोन अगर मैं का उपयोग इस तरह एक आईपी पता सही है?

self.hostReach = [Reachability reachabilityWithHostName: @"1.2.3.4"]; 

क्या यह सार्वजनिक आईपी का उपयोग करना सुरक्षित है? उदाहरण के लिए "17.178.96.5 9" apple.com

के लिए nslookup का परिणाम है Reachability क्लास में एक विधि है जो एप्पल के डेमो से उपयोग की जाने वाली प्रतीत होती है।

- (BOOL)connectionRequired 
{ 
    NSAssert(_reachabilityRef != NULL, @"connectionRequired called with NULL reachabilityRef"); 
    SCNetworkReachabilityFlags flags; 

    if (SCNetworkReachabilityGetFlags(_reachabilityRef, &flags)) 
    { 
     return (flags & kSCNetworkReachabilityFlagsConnectionRequired); 
    } 

    return NO; 
} 

कनेक्शन की आवश्यकता क्यों है? समस्या का समाधान करने के लिए इस्तेमाल किया जा सकता है?

+0

आप हर 10 मिनट के बाद विधियों को क्यों बुला रहे हैं, तो आप https://github.com/ashleymills/Reachability.swift –

+0

का उपयोग कर सकते हैं मुझे हर 10 मिनट में लगभग – cateof

उत्तर

0

पहुंच योग्यता होस्ट नाम के साथ बनाई जानी चाहिए, स्पष्ट पता नहीं। DNSsystem का पूरा बिंदु यह है कि कभी-कभी होस्ट के लिए पते बदलते हैं। किसी नाम सर्वर से सीधे लिंक करना इस संबंध में कुछ सुरक्षा प्रदान करना चाहिए, लेकिन ऐसा नहीं है कि इसे कैसे काम करना चाहिए।

पहुंच योग्यता अक्सर एक कठिन अनुमान है, कठिन और तेज़ नहीं। सुनिश्चित करने का एकमात्र तरीका वास्तव में कोशिश करना है। कनेक्शन की आवश्यकता इस से संबंधित है, क्योंकि यह डिवाइस कह रही है कि 'सब ठीक दिखता है, मैंने अभी वास्तविक के लिए कनेक्ट करने की कोशिश नहीं की है'।

तो, तर्कसंगत रूप से आपको पहुंचने की स्थिति की जांच किए बिना जीवित रहने की आग लगनी चाहिए और यह तय करने के अनुरोध के परिणाम का उपयोग करना चाहिए कि कोई त्रुटि है या नहीं। यदि आपको निश्चित रूप से सुनिश्चित करने की आवश्यकता है, तो वास्तविक अनुरोध भेजें और वास्तविक परिणाम की समीक्षा करें।

+0

उदाहरण कोड कहीं भी एक सिप रजिस्टर ईवेंट ट्रिगर करने की आवश्यकता है? – cateof

+0

उदाहरण के लिए बिल्कुल सही कोड क्या है? मेरा मतलब है कि अपने 'ताज़ा करें' आग लगाना और प्रतिक्रिया की जांच करें – Wain

1

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

जो कुछ आप देख रहे हैं वह शायद कुछ जाग रहा है जब फ़ोन अनलॉक हो जाता है (आपका ऐप या पृष्ठभूमि अनुमतियों के साथ कुछ अन्य ऐप) और इसलिए सब कुछ उठता है, तो आप तुरंत एक त्रुटि देखते हैं, लेकिन फिर वाईफाई कनेक्ट हो जाता है और आप फिर से कनेक्ट होते हैं ।

आपको पहुंच क्षमता को संभालने की आवश्यकता है जैसे कि यह आपको "निश्चित रूप से पहुंचने योग्य" या "निश्चित रूप से पहुंच योग्य नहीं" बल्कि "स्थिति अज्ञात" भी बता सकता है। आपको यह तय करने की ज़रूरत है कि आप अज्ञात स्थिति में क्या करने जा रहे हैं। यदि आप तुरंत नेटवर्क कनेक्शन बनाते हैं तो आप सामान्य से बैटरी को तेज़ी से निकाल देंगे। किसी अन्य कारण से नेटवर्क को जागने के लिए इंतजार करना एक विकल्प हो सकता है। यह वास्तव में आप पर निर्भर है।

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