有没有办法在Windows Phone上跨WebBrowser实例持久存储cookie或HTML5 localStorage?

时间:2013-06-26 19:56:01

标签: html5 windows-phone-8 webbrowser-control local-storage

简短版本:我在Windows Phone 8应用程序中托管了一个WebBrowser控件。如何存储来自javascript的值,以便它们在用户关闭并重新打开我的应用程序时保持不变?

长版:

我正在开发一个Windows Phone 8应用程序,该应用程序在单个MainPage.xaml页面中托管一个WebBrowser控件,该页面适用于我的应用程序的整个生命周期。在Visual Studio 2012中创建项目时,我使用“Windows Phone HTML5 App”项目类型创建了应用程序。我的应用程序的99%托管在WebBrowser指向Web页面的网页中(在互联网上,而不是存储在手机上)去应用程序启动时。在我的应用程序的网页中,我试图跨页面和跨会话保持数据。例如,一旦用户登录一次,我想将其存储在手机上,以便下次启动应用时,他们不必再次登录。

Cookie和HTML5本地存储(通过window.localStorage.setItem和getItem)可以在应用运行时在应用中的页面之间共享数据,即使您切换出应用(通过Windows手机“硬盘”)按钮“)然后返回。但如果用户通过按下”硬“按钮退出应用程序,则下次启动应用程序时,所有localStorage和cookie似乎都会消失。

这是预期的行为吗?我想我不确定WebBrowser会在哪里存储数据(隔离存储?或者如果使用Internet Explorer访问网站,可能存放在同一个地方?)。在任何情况下,如果没有“修复”这个,任何人都可以最好的方式来提供我自己的存储机制,以便我可以让我的javascript代码在我的应用程序运行的实例中保持值?如果我知道使用javascript从中获取和检索值的方法,我很高兴使用该应用程序的独立存储。谢谢。

1 个答案:

答案 0 :(得分:0)

我不确定这是否是预期的行为。

要获得隔离存储,您需要使用JS / .NET互操作。

如果你想从JS触发持久存储:

在JS中使用window.external.notify,生成一个JSON字符串(例如)以传递给.NET端。这可以写入IsolatedStorage,而.NET不必解析数据。您可以使用IsolatedStorage.AppSettings或完整文件,具体取决于数据的大小。

或者,您可以从.NET触发进程:

调用WebBrowser.InvokeScript来调用JS函数,该函数返回表示数据的相同JSON字符串。

.NET端可以在启动时检测并恢复此数据,并使用WebBrowser.InvokeScript通过JS函数将JSON字符串传递回WebBrowser。

您当然必须处理错误情况(尝试恢复错误/损坏的JSON)。

此外,如果您从.NET触发此事件以响应App.Closing事件,则需要注意不要花太长时间写入数据。 你运行得越快越好,但这肯定需要在10秒内完成,否则操作系统会杀死你的应用程序。

请参阅WebBrowser.InvokeScript()ScriptNotify registration to window.external.notify的MSDN文档。