2012-07-16 19 views
6

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

मैं ऐप के मुख्य दृश्य पर viewDidLoad फ़ंक्शन में iCloud मान की जांच करता हूं।

तो, मेरे सवालों का:

  • इस अपेक्षित व्यवहार है?
  • यदि हां, तो कोई और समाधान है?
  • क्या यह मामला हो सकता है कि यह एक्सकोड से चलने पर केवल एक समस्या है, शिपिंग संस्करण नहीं? यदि हां, तो परीक्षण कैसे करें?

धन्यवाद!

जैस्पर

+0

इस प्रश्न को देखें: http://stackoverflow.com/questions/12539266/icloud-nsubiquitouskeyvaluestore-initial-sync-access-delay-how-to-handle – erkanyildiz

उत्तर

2

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

इसे समेटने के लिए: हाँ, यह बिल्कुल सामान्य लगता है।

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

+0

आपकी प्रतिक्रिया के लिए धन्यवाद! प्रारंभिक iCloud सिंक समाप्त होने पर जांचने का कोई तरीका है? –

+0

आपको NSUbiquitousKeyValueStoreDidChangeExternallyNotification अधिसूचना की सदस्यता लेनी होगी। प्रलेखन में एक उदाहरण है :-) http://developer.apple.com/library/ios/documentation/cocoa/Conceptual/UserDefaults/StoringPreferenceDatainiCloud/StoringPreferenceDatainiCloud.html –

+0

@ BjörnKaiser मुझे एक ही समस्या है लेकिन इससे कोई फर्क नहीं पड़ता कि मैं कितनी देर तक पहले ऐप लॉन्च पर प्रतीक्षा करें, कोई अधिसूचना कभी नहीं आती है, और यह तब होता है जब मुझे पता है कि डेटा iCloud में keyValueStore पर मौजूद है। – pulkitsinghal

1

आपके पास कोई गारंटी नहीं है NSUbiquitousKeyValueStore अपना पहला सिंक्रनाइज़ेशन समाप्त कर देगा क्योंकि आपका ऐप पहली बार लॉन्च हुआ है। (वास्तव में, आईओएस 5 पर, यह अक्सर आपके ऐप को पहली बार लॉन्च करने के बाद सिंक करना शुरू हो जाता है)।

यह जानने का कोई तरीका नहीं है कि पहली प्रारंभिक सिंक पहले से ही हो चुकी है, चल रहा है या समाप्त हो गया है। आप (वास्तव में ) NSUbiquitousKeyValueStoreDidChangeExternallyNotification की सदस्यता ले सकते हैं। चाल यह है कि यदि आपकी दुकान iCloud सर्वर पर खाली है, तो आपको प्रारंभिक सिंक के बाद कोई अधिसूचना नहीं मिलेगी (क्योंकि आपका स्थानीय स्टोर खाली है और क्लाउड स्टोर खाली भी है, प्रारंभिक के बाद कुछ भी "बाहरी रूप से" नहीं बदला गया सिंक ...)

आम तौर पर, आपको प्रारंभिक सिंक पर भरोसा नहीं करना चाहिए।

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

अंत में, यदि आप वास्तव में प्रारंभिक सिंक पूरा होने के बारे में जानना चाहते हैं या नहीं, तो कृपया bugreport.apple.com पर एक बग दर्ज करें और समझाएं कि आपको वास्तव में इसकी आवश्यकता क्यों है।

6

मेरे पास एक समान समस्या थी जहां NSUbiquitousKeyValueStoreDidChangeExternallyNotification स्थापित करने के बाद पहले लॉन्च पर ट्रिगर नहीं कर रहा था, इससे कोई फर्क नहीं पड़ता कि मैं कब तक इंतजार कर रहा था। NSUBiquitousKeyValueStore में प्रारंभिक कुंजी सेट करना इसे हल करना प्रतीत होता था।

तुरंत डिफ़ॉल्ट स्टोर के लिए पर्यवेक्षक को जोड़ने के बाद, मैं फोन:

[[NSUbiquitousKeyValueStore defaultStore] setString:@"testValue" forKey:@"testKey"]; 
[[NSUbiquitousKeyValueStore defaultStore] synchronize]; 

मैं वास्तविक डेटा मैं समन्वयित करना चाहते हैं अलग कुंजियों (अर्थात नहीं testKey) का उपयोग करें।

+1

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

+0

इस समाधान को आजमाने के लिए जा रहे हैं ... बाद में रिपोर्ट करेंगे .. – CthulhuJon

+0

मदद नहीं की। ऐसा लगता है कि iCloud सर्वर प्रतिक्रिया सहेजने या लोड करने में बहुत धीमी गति से पहुंच सकती है, और आपके ऐप को इन async घटनाओं को संभालने में सक्षम होना चाहिए। डेटा आमतौर पर उपलब्ध होता है .... "बाद में", लेकिन शायद ही कभी ऐप शुरू होने के 30 सेकंड के भीतर। – CthulhuJon

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