2011-11-02 6 views
10

iPhoneの「ホーム画面」に保存できるwebappを作成しました。アプリはキャンバスを使用しており、変化する状態とかなりインタラクティブです。iPhoneのWebApp on Home画面の永続性

アプリが最小化されて再び開いたときはいつでも、初期状態に戻ります。同じ(期待通り)は、アプリケーションを終了して再読み込みするときに発生します。

  1. どのように私はそれが単に最小化されたときに再ロードされてからアプリを防ぐことができますか?

  2. を閉じてもう一度開いたときに状態データを保持する最善の方法は何ですか?

  3. 状態データが失われないようにするためにどのようなイベントを使用する必要がありますか?

可能クロスプラットフォームソリューションは、iPhone + Androidの好まれる場合...

答えて

8

TL; DR ローカルストレージまたはクッキーなどの状態を保存できるメカニズムを使用するようにアプリケーションを設計する必要があります。このローカルストレージを見て、起動するたびにそのインターフェイスを再構築する必要があります。ローカルストレージまたはwebdb(償却がサポートされています)を使用すると、すべての状態の変更を保存し、ページがブラウザに読み込まれたときにそれらをリロードする必要があります。

  1. 最小化を定義しますか?バックグラウンドで走っている?

    あなたのwebappは、ホーム画面のステータスに関係なく、ブラウザに読み込まれた別のページに過ぎません。 a)デバイス上のメモリが不足していること、およびb)マルチタスキングがどのように機能するかによって、アプリケーションはオペレーティングシステムによってメモリを解放するか、いつでも終了することができます。

    あなたが持っているiOSアプリ構築しているとき、なぜこれがある:

    - (void)applicationWillTerminate:(UIApplication *)application

    このメソッドは、あなたが(例えば、ユーザデータを保存するよう)を使用する動作を指定するために、開発者として、許可する前にOSからの終了信号を受信すると、アプリケーションは終了します。これは、iOSデベロッパーガイドが州を維持するよう依頼し、アプリがフォアグラウンドに持ち込まれたときに状態が復元されることを常に確認する理由です。 (ユーザーは、自宅をダブルクリックすると "実行中のアプリケーション"リストに表示されるため、アプリケーションが終了したことを知ることはできません)。

    ここで私はあなたがウェブアプリケーションについて話していることを理解していますが、これは重要です。Webページ、私はあなたも確信しています。携帯電話のメモリをいくつか使います。DOM、すべてのリソース、ページの場所に関する州に関する情報、およびどのウィジェットが何に設定されているのかを知っています。キャンバスなどを使ってあなたのアプリがかなりインタラクティブであると言います - 私はそれが多くのメモリを要すると確信しています。

    Safariをバックグラウンドに置くと、Safariはメモリ内のキャッシュを破棄する可能性が最も高いです。

  2. Safariは、ローカルストレージとCookieデータの両方にアクセスできます。 iOS5もWebSQLにアクセスできます(ただし、WebSQLが犠牲になるため悲しいIndexedDBはありません)。あなたの毒を選んでください。

  3. 常に状態を保存する必要があります。あなたはJSを介してUIApplicationDelegateメソッドにアクセスすることができないので、ユーザーが何かをするたびに、その状態の変更を保存する必要があります。また、ページがリロードされるたびに、選択したストレージオプションから永続的な状態を確認してリロードする必要があります。

+0

yep、minimized =バックグラウンドで実行中。ネイティブiPhoneアプリケーションを作成する場合、JavaScriptがネイティブObjectiveCと通信することは可能ですか(逆も可能です)。例えば、私が 'UIWebView'を使用していたとします。私はiphone + android用のWebアプリケーションを作成するのは簡単だと思っていたが、かなりの落とし穴があるようだ。 –

+0

uiwebviewで実行されているのはネイティブアプリではないため、ネイティブアプリフレームワークのコンテキスト外で処理する必要があります。 「簡単」ですが、電話機がアプリケーション内のWebビューをどのように処理するかに特に注意する必要があります。 – tkone

+0

恐らく 'stringByEvaluatingJavaScriptFromString'はUIWebViewのコンテキスト内から関数を実行するために使用できますか?だからもし私が1秒に1回その関数を呼び出すのであれば、アクション名/ paramsをエンコードされた文字列として取得し、必要に応じてユーザーに応答することができます。これは、Webビュー内のJavaScriptがネイティブのアプリコードに通知することを可能にするか、より良いアプローチです。あなたの洞察力に感謝します。 –

1

あなたがのlocalStorage APIを使用して現在の状態を保存し、負荷に、このAPIから復元する場合は、再作成することができるはずアプリケーションの状態

私は、ローカルストレージAPIの概要については、このページをお勧めします。http://diveintohtml5.info/storage.html

私はそれがバックグラウンドにあるとき、あなたはトラブルメモリ内のアプリケーション/ Webページを防止することがあります怖いが、連続のlocalStorageに状態を保存しますページがロードされると状態を回復します(window.onloadまたは$(document).ready())は解決策になります。

0
  1. 私はあなたが
  2. ことができるとは思わないWebKitが、私はそう、あなたのWebアプリケーションは、決算上の通知になるだろうどのような方法を知らないあなたは
  3. を使用することができHTML5クライアント側のデータストレージをサポートしていますあなたのナビゲーションなど(Background behavior for iOS Web App (so app doesn't restart))の各ステップの後に現在の状態を保存しようとする必要があります。
0

あなたのアプリは、レンダリングのためのキャンバスを使用している場合は、ページがアンロードされるたびに機能が

ctx.getImageData() 
を使用してキャンバスのピクセルデータをキャプチャすることwindow.unloadまたはpagehideイベントに関数を結合することができます
  • ローカルストアに保存すると、ページがリロードされたときに即座にリロードできるようにそのデータをキャンバスに直接プッシュして、実際のアプリケーションを読み込んでいる間にスピントップを置くことができます。