2013-06-26 21 views
1

簡短版本:我有一個WebBrowser控件託管在Windows Phone 8應用程序中。如何從JavaScript存儲值,以便它們在用戶關閉並重新打開我的應用程序時持續存在?有沒有辦法在Windows Phone上的WebBrowser實例間保存Cookie或HTML5 localStorage?

龍版本:

我開發具有這樣的生活我的應用程序的整個生命單MainPage.xaml中頁面託管一個WebBrowser控件在Windows Phone 8的應用程序。在Visual Studio 2012中創建項目時,我使用「Windows Phone HTML5應用程序」項目類型創建了應用程序。我的應用程序的99%託管在Web頁面中(在互聯網上,未存儲在電話中),我將WebBrowser去應用程序啓動時。在我的應用程序的網頁中,我試圖跨頁面和跨會話保存數據。例如,一旦用戶登錄一次,我想將它保存在手機中,以便下次啓動應用程序時不必再次登錄。

Cookies和HTML5本地存儲(通過window.localStorage.setItem和getItem)在應用程序運行時可以在應用程序中的頁面之間共享數據,並且即使切換出應用程序(通過Windows手機「硬按鈕「),然後返回。但是,如果用戶通過按下」後退「按鈕退出應用程序,則下次啓動應用程序時,所有localStorage和cookie似乎都消失了。

這是預期的行爲?我想我不確定WebBrowser會在哪裏存儲數據(獨立存儲?或者,如果使用Internet Explorer訪問網站,它可能存儲在同一個地方)。在任何情況下,如果沒有「修復」這個,任何人都可以提供我自己的存儲機制的最佳方式,以便我可以讓我的JavaScript代碼在我的應用程序的實例運行時保持值?我很高興能夠使用應用程序的隔離存儲,只要我知道使用JavaScript獲取和檢索值的方法。謝謝。

+0

事實證明,WebBrowser控件**不會**正確存儲其應用程序實例之間的狀態。由於我在調用ClearCache()作爲應用程序的刷新按鈕的一部分(因爲沒有調用ClearCache(),WebBrowser會刷新頁面,但不會重新下載內容),導致我自己不知道該問題。事實證明,調用ClearCache()也會刪除cookie,所以只要我停止調用ClearCache(),一切都開始正常工作。保羅的解決方法可能會起作用,但在這種情況下,我並不需要它。 –

回答

0

我不確定這是否是預期的行爲。

要獲得獨立存儲,您將需要使用JS/.NET互操作。

如果要觸發從JS持久存儲:

使用window.external.notify在JS,生成一個JSON字符串(例如)沿到.NET一側通過。這可以寫入IsolatedStorage而無需.NET解析數據。您可以使用IsolatedStorage.AppSettings或完整文件,具體取決於數據的大小。

或者你可以從.NET觸發過程:

呼叫WebBrowser.InvokeScript調用JS函數返回一個表示你的數據相同的JSON字符串。

.NET端可以在啓動時檢測並恢復此數據,並使用WebBrowser.InvokeScript通過JS函數將JSON字符串傳回WebBrowser。

你當然必須處理錯誤情況(試圖恢復損壞/損壞的JSON)。另外,如果您從.NET中響應App.Closing事件觸發此事件,則需要注意不要花太長時間寫入數據。 運行速度越快越好,但這肯定需要在10秒內完成,否則操作系統將會終止您的應用程序。

請參閱MSDN文檔WebBrowser.InvokeScript()ScriptNotify registration to window.external.notify

+0

感謝Paul的回覆。這是一個很好的解決方法。如果我沒有從任何人那裏得到任何關於這個問題的「解決方法」的信息(例如,讓WebBrowser堅持其內部狀態的方式),那麼我會將你的問題標記爲答案。我仍然希望有一種方法可以讓WebBrowser保持其狀態,例如,如果用戶登錄到Facebook然後退出應用程序,那麼當他們的Cookie不見了時,他們必須再次重新啓動應用程序時重新登錄。 –

+0

事實證明,我自己無意中造成了原始問題,畢竟不需要此解決方法。但是,因爲我確實問過「如何從JavaScript存儲值以便它們在用戶關閉並重新打開我的應用程序時持續存在?」,我將其標記爲答案。謝謝保羅。 –

相關問題