1

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

长版:

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

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

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

4

1 回答 1

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 注册到 window.external.notify的信息,请参阅 MSDN 文档。

于 2013-06-26T21:06:55.813 回答