简短版本:我在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从中获取和检索值的方法,我很高兴使用该应用程序的独立存储。谢谢。
答案 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文档。