2011-11-02 38 views
10

मैंने एक वेबपैप बनाया है जिसे आईफोन पर "होम स्क्रीन" में सहेजा जा सकता है। ऐप कैनवास का उपयोग करता है और बदलती स्थिति के साथ काफी इंटरैक्टिव है।होम स्क्रीन पर्सिस्टेंस पर आईफोन वेब ऐप

जब भी ऐप को कम किया जाता है और फिर से खोला जाता है तो यह प्रारंभिक स्थिति में वापस रीसेट हो जाता है। ऐप बंद करने और इसे पुनः लोड करने पर वही (अपेक्षित) होता है।

  1. मैं ऐप को केवल न्यूनतम होने पर पुनः लोड होने से कैसे रोक सकता हूं?

  2. राज्य डेटा को बनाए रखने का सबसे अच्छा तरीका क्या है ताकि जब ऐप बंद हो जाए और फिर से खोला जाए तो यह निरंतर जारी रहेगा?

  3. यह सुनिश्चित करने के लिए कि राज्य डेटा खो गया है, मुझे किन घटनाओं का उपयोग करने की आवश्यकता होगी?

संभव एक क्रॉस मंच समाधान को प्राथमिकता दी जाएगी iPhone + Android ...

उत्तर

8

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

  1. कम से कम परिभाषित करें? पृष्ठभूमि में चल रहा है?

    होमप्रीन पर इसकी स्थिति के बावजूद, आपका वेबपैप, ब्राउज़र में लोड किया गया एक और पृष्ठ है। ए के कारण) डिवाइस पर स्मृति की कमी और बी) मल्टीटास्किंग कैसे काम करती है, ऑपरेटिंग सिस्टम द्वारा स्मृति को मुक्त करने के लिए या किसी भी समय स्वयं को समाप्त करने के लिए अनुप्रयोगों से पूछा जा सकता है।

    यही कारण है कि जब आप किसी iOS एप्लिकेशन का निर्माण कर रहे आपके पास:

    - (void)applicationWillTerminate:(UIApplication *)application

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

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

    तो जब आप पृष्ठभूमि में सफारी डालते हैं, तो सफारी आपके इन-मेमोरी कैश को कचरा करने की संभावना है।

  2. सफारी के पास स्थानीय संग्रहण और कुकी डेटा दोनों तक पहुंच है। आईओएस 5 के पास वेबस्क्लुएल तक पहुंच है (लेकिन कोई इंडेक्सड डीबी जो दुखी है क्योंकि वेबएसक्यूएल की कमी है)। अपना जहर चुनें।

  3. आपको हमेशा राज्य को सहेजने की आवश्यकता होगी। चूंकि आपके पास जेएस के माध्यम से UIAplplicationDelegate विधियों तक पहुंच नहीं है, हर बार जब उपयोगकर्ता कुछ करता है, तो आपको उस राज्य परिवर्तन को सहेजने की आवश्यकता होगी। और हर बार जब आपका पृष्ठ पुनः लोड किया जाता है, तो उसे एक स्थिर स्थिति की जांच करने और आपके द्वारा चुने गए स्टोरेज विकल्प से पुनः लोड करने की आवश्यकता होती है।

+0

हाँ, न्यूनतम = पृष्ठभूमि में चल रहा है। अगर मैं मूल आईफोन ऐप बनाना चाहता था, तो जावास्क्रिप्ट के लिए मूल उद्देश्य सी (और इसके विपरीत) के साथ संवाद करना संभव है? उदाहरण के लिए यदि मैं 'UIWebView' का उपयोग करना चाहता था। मैंने सोचा कि आईफोन + एंड्रॉइड के लिए वेब ऐप बनाना आसान था, लेकिन कुछ सुंदर नुकसान होने लगते हैं। –

+0

यदि यह uiwebview में चल रहा है तो यह मूल ऐप नहीं है जिसका अर्थ है कि आपको देशी ऐप ढांचे के संदर्भ में चीजों को संभालना होगा। यह "आसान" है लेकिन अनुप्रयोगों के भीतर फोन वेब दृश्यों को कैसे प्रबंधित करता है इस पर विशेष ध्यान देने की आवश्यकता है। – tkone

+0

संभवतः 'stringByEvaluatingJavaScriptFromString' का उपयोग UIWebView के संदर्भ में फ़ंक्शंस निष्पादित करने के लिए किया जा सकता है? तो अगर मैं एक बार एक बार उस समारोह को आह्वान करना चाहता था तो यह एक एन्कोडेड स्ट्रिंग के रूप में एक एक्शन नाम/पैराम्स पुनर्प्राप्त कर सकता था और फिर आवश्यकतानुसार उपयोगकर्ता को जवाब दे सकता था। जो देशी ऐप कोड को सूचित करने के लिए जावास्क्रिप्ट को वेब दृश्य के भीतर से अनुमति देगा ... या कोई बेहतर दृष्टिकोण है। मैं आपकी अंतर्दृष्टि धन्यवाद की सराहना करता हूं –

1

आप localStorage एपीआई का उपयोग कर वर्तमान स्थिति को बचाने और लोड पर इस एपीआई से बहाल हैं, तो आप पुन: बनाने में सक्षम होना चाहिए, तो आवेदन राज्य

मैं स्थानीय भंडारण एपीआई के अवलोकन के लिए इस पेज की सिफारिश: http://diveintohtml5.info/storage.html

मुझे डर है कि आप मुसीबत स्मृति में आवेदन/वेबपेज को रोकने जब यह पृष्ठभूमि में है, लेकिन लगातार localStorage करने के लिए राज्य भंडारण होगा हूँ और पृष्ठों को लोड होने पर स्थिति पुनर्प्राप्त करें (window.onload या $ (दस्तावेज़) .ready()) एक समाधान होगा।

0
  1. मैं तुम्हें
  2. वेबकिट का समर्थन करता है एचटीएमएल 5 क्लाइंट-साइड डेटा भंडारण, जो आप
  3. इस्तेमाल कर सकते हैं कर सकते हैं मैं किसी भी तरह अपने webapp समापन पर सूचित कर दिया जाएगा के बारे में पता नहीं है नहीं लगता है, तो आपको अपने नेविगेशन आदि में प्रत्येक चरण के बाद वर्तमान स्थिति को सहेजने का प्रयास करना चाहिए (Background behavior for iOS Web App (so app doesn't restart))।
0

आपका ऐप्लिकेशन केवल कैनवास उपयोग कर रहा है के लिए प्रस्तुत करना है, तो आप window.unload या pagehide घटना है कि जब भी पेज उतार दिया है समारोह कैनवास का उपयोग करने का पिक्सेल डेटा कब्जा करने के लिए एक समारोह के लिए बाध्य कर सकता है

ctx.getImageData() 
  • और स्थानीय स्टोरेज में स्टोर करता है, तो जब पृष्ठ पुनः लोड किया जाता है तो आप उस डेटा को सीधे तत्काल रीलोड के लिए कैनवास पर धक्का दे सकते हैं और जब आप इसके पीछे असली एप्लिकेशन लोड करते हैं तो स्पिनर ऑनटॉप डाल सकते हैं।
संबंधित मुद्दे