2011-11-02 74 views
10

我已經創建了一個可以保存到iPhone上的「主屏幕」的web應用程序。該應用程序使用畫布,並與狀態更改相當互動。主屏幕持久性iPhone WebApp

每當應用程序最小化並重新打開時,它將重置回初始狀態。關閉應用程序並重新加載時會發生同樣的情況(如預期的那樣)。

  1. 我怎樣才能防止應用程序重新加載時,它只是最小化?

  2. 堅持狀態數據的最佳方式是什麼?當應用程序關閉並重新打開時,它會無縫地繼續?

  3. 我需要使用哪些事件來確保狀態數據不會丟失?

如果可能的話一個跨平臺的解決方案是首選iPhone + Android的...

回答

8

TL; DR 您需要將您的應用程序設計爲使用本地存儲或cookie或其他一些可以保留狀態的機制。每次啓動時,它都需要查看本地存儲並重新構建它的界面。使用本地存儲或webdb(折舊但支持),您需要保存每個狀態更改,並確保在頁面加載到瀏覽器時重新加載它們。

  1. Define minimized?在後臺運行?

    您的web應用程序,無論它在主屏幕上的狀態如何,只是另一個頁面加載到瀏覽器。由於a)設備上的內存不足,以及b)多任務如何工作,操作系統可能會要求應用程序釋放內存或者甚至在任何時候自行終止。

    這就是爲什麼當你正在構建一個iOS應用程序,你必須:

    - (void)applicationWillTerminate:(UIApplication *)application

    此方法允許您,作爲開發者,指定行爲,以便使用(如保存用戶數據)之前,您的應用程序在從操作系統收到終止信號時終止。這也是爲什麼iOS開發人員指南要求您保留狀態並且始終確保您的狀態在應用程序進入前臺時恢復的原因。 (用戶可能不知道某個應用程序已終止,因爲當您雙擊該主頁時它仍會出現在「正在運行的應用程序」列表中)。

    現在我明白你在談論一個網絡應用程序,但這很重要。網頁,我相信你也是這樣,在手機中佔用一些內存 - 你已經獲得了DOM,所有的資源,關於狀態的信息,以及頁面的位置和小部件的設置。你說你的應用程序使用畫布和東西相當互動 - 我相信它佔用了大量的內存。

    因此,當您將Safari放入後臺時,Safari很可能會摧毀您的內存緩存。

  2. Safari可以訪問本地存儲和cookie數據。 iOS5也可以訪問WebSQL(但沒有IndexedDB,因爲WebSQL已經摺舊了,所以這很可悲)。選擇你的毒藥。

  3. 您需要始終保存狀態。由於您無法通過JS訪問UIApplicationDelegate方法,因此每次用戶執行某些操作時,都需要保存該狀態更改。每次頁面重新加載時,都需要檢查持久狀態並從您選擇的存儲選項中重新加載。

+0

是的,最小化=在後臺運行。如果我要創建本機iPhone應用程序,JavaScript是否可以與本機ObjectiveC進行通信(反之亦然)?例如,如果我要使用'UIWebView'。我認爲它應該很容易爲iphone + android創建web應用程序,但似乎存在一些相當主要的缺陷。 –

+0

如果它在uiwebview中運行,它不是一個本地應用程序,這意味着你必須處理本機應用程序框架環境之外的事情。這很「容易」,但需要特別注意手機在應用程序中如何處理網絡視圖。 – tkone

+0

據推測'stringByEvaluatingJavaScriptFromString'可以用來執行UIWebView的上下文中的函數嗎?因此,如果我每秒調用一次該函數,它可以檢索一個操作名稱/ params作爲編碼字符串,然後根據需要回複用戶。這將允許來自Web視圖內的JavaScript通知本地應用程序代碼......或者是否有更好的方法。感謝您的見解 –

1

如果使用localStorage的API保存當前狀態,並從負載此API恢復,你應該能夠重新應用程序狀態。

我建議這個頁面的本地存儲API的概述:http://diveintohtml5.info/storage.html

恐怕你會遇到麻煩防止在內存中的應用程序/網頁時,它在後臺運行,但連續存儲狀態的localStorage並在頁面加載時恢復狀態(window.onload或$(document).ready())將是一個解決方案。

0

如果您的應用只使用畫布渲染,那麼你可以綁定到window.unload或每當頁面被卸載功能捕獲使用畫布的像素數據pagehide事件的功能

ctx.getImageData() 
  • 並將其存儲在localstorage中,然後當頁面重新加載時,您可以將該數據直接推送到畫布以便即時重新加載,並在您將實際應用程序加載到它後面時放置一個微調器ontop。