2012-09-19 13 views
9

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

जो मैं वास्तव में देख रहा हूं वह ऐसा करने का सबसे अच्छा तरीका है। यह कैसे किया जाता है?
क्या उनके पास एक सामान्य UIViewController है जो हर बार कनेक्शन की आवश्यकता होने पर पहुंच के लिए जांच करता है?
या क्या उनके पास प्रत्येक इंटरनेट अनुरोध से पहले एक प्रकार का प्रॉक्सी क्लास है जो अनुरोध को रद्द करता है और एक संदेश प्रदर्शित करता है? आप लोग इसके साथ कैसे काम कर रहे हैं?

धन्यवाद।

संपादित करें:

समाधान के साथ मैं AFNetworking जो भी बॉक्स में गम्यता स्थिति प्रदान उपयोग कर रहा है आया।
मूल रूप से मैंने एक AFHTTP क्लाइंट बनाया और स्थिति परिवर्तनों को सुनने के लिए उस पर एक पहुंच क्षमता कॉलबैक ब्लॉक सेट किया। AFHTTP क्लाइंट ऑब्जेक्ट विस्तृत है (एक सिंगलटन की तरह)। (वास्तव में मेरे पास प्रति होस्ट एक AFHTTP क्लाइंट है, मुझे a.com, b.com ... तक पहुंचने की आवश्यकता है।)।

फिर जब मुझे कोई अनुरोध करने की आवश्यकता होती है तो मैं एक नया AFHTTPRequestOperation (मेरे मामले में AFJSONRequestOperation) बना देता हूं और मैं इसे अपने AFHTTP क्लाइंट ऑब्जेक्ट पर लगाता हूं। ऑपरेशन की विफलता ब्लॉक में मैं यह देखने के लिए जांच करता हूं कि मेजबान AFHTTPClient की networkReachabilityStatus संपत्ति के साथ पहुंच योग्य है या नहीं। यदि यह पहुंच योग्य नहीं है तो मैं एक संदेश प्रदर्शित करता हूं कि उपयोगकर्ता के साथ कोई इंटरनेट कनेक्शन नहीं है।

मैंने इसे लपेट लिया ताकि मुझे हर बार एक ऑपरेशन बनाने की आवश्यकता न हो। तो अब ऐप में, जब भी कोई कनेक्शन नहीं होता है तो उपयोगकर्ता कुछ करने का प्रयास करता है, उसे एक संदेश मिला कि उसे कोई इंटरनेट एक्सेस नहीं है।
मैं कनेक्शन वापस पाने के बाद स्क्रीन पर डेटा पुनः लोड करने के लिए पहुंच क्षमता कॉलबैक का भी उपयोग करता हूं (या एक बार जब मुझे कनेक्शन होना चाहिए)।
मुझे नहीं पता कि यह सबसे अच्छा अभ्यास है, लेकिन मुझे लगता है कि यह जानना अच्छा लगता है कि ऐप एक नया कनेक्शन उपलब्ध होने पर महत्वपूर्ण डेटा को पुनः लोड करने का ख्याल रखता है।

यदि कोई नमूना कोड से रूचि रखता है तो मैं इसे प्रदान कर सकता हूं।

उत्तर

15

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

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

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

अन्य बात: स्टेटस बार में प्रदर्शित किए गए किसी भी से बेहतर "नेटवर्क संकेत" नहीं है: यदि आपके पास वाई-फाई आइकन, 3 जी/4 जी आइकन, सेलुलर फील्ड ताकत है।

अपने मूल प्रश्न पर लौटना: इस सामान को प्रबंधित करने का कोई बेहतर तरीका नहीं है, यह एप्लिकेशन आर्किटेक्चर पर भारी निर्भर करता है। यदि आप अपने नेटवर्किंग सामान को एक समर्पित कक्षा में केंद्रित करना पसंद करते हैं (एक UIViewController नहीं बल्कि एक NSObject सबक्लास) तो यह उस कक्षा के लिए केवल पढ़ने योग्य संपत्ति को परिभाषित करने के लिए समझ में आ सकता है जिसे नवीनतम इंटरनेट कनेक्शन के बाद "सफलता/विफल" के साथ अपडेट किया गया है सर्वर ऐप के साथ (Google या Apple जैसे अन्य सर्वरों को पिंग करने का कोई मतलब नहीं है: सबसे पहले यह सुरुचिपूर्ण नहीं है, दूसरा मुद्दा आपके सर्वर से आ सकता है जो ऐप की सेवा करता है और डिवाइस इंटरनेट कनेक्शन स्थिति नहीं!)।

@property (readonly) BOOL lastConnectionToMyServerSuccess
फिर आपके व्यू कंट्रोलर इस संपत्ति में परिवर्तन (केवीओ या केंद्रीय अधिसूचना द्वारा) को पंजीकृत कर सकते हैं और आइकन को दिखाकर उनके यूआई को तदनुसार अपडेट कर सकते हैं (मैं दोहराता हूं: उपयोगकर्ता को इंटरनेट से कनेक्ट करने का मैन्युअल रूप से प्रयास करने की संभावना छोड़ दें)। दृष्टि से बाहर होने पर नियंत्रकों को केवीओ से अनियंत्रित होना चाहिए ("viewWillDisappear:") या अनलोड ("viewDidLoad:") या dealloc'd।

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

+0

इस उत्तर के लिए बहुत बहुत धन्यवाद, क्या आपको याद है कि डब्ल्यूडब्ल्यूडीसी टॉक/वीडियो कौन सा है? – florian

+0

इसे याद रखने के लिए निश्चित नहीं है। सत्र 706 और 225 (सत्र का दूसरा भाग) आज़माएं। – viggio24

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