Android 设备上 Phonegap 应用程序的本地存储是不是与内置浏览器分开?

Posted

技术标签:

【中文标题】Android 设备上 Phonegap 应用程序的本地存储是不是与内置浏览器分开?【英文标题】:Is local storage for a Phonegap app on an Android device separate from the built in browser?Android 设备上 Phonegap 应用程序的本地存储是否与内置浏览器分开? 【发布时间】:2013-02-17 12:55:00 【问题描述】:

我的问题本质上是对this question 的跟进或澄清。

我有一个使用 javascript 和 Adobe's Phonegap Build service 构建的 android 应用,我正在使用“本地存储”在设备上存储数据。

从另一个问题中,我了解到存储在本地存储中的数据本质上是“永久的”,因为它将无限期地保留在设备上,除非用户通过手动清除应用程序的缓存或删除应用程序对其进行操作(也许还有我愿意忍受的其他不寻常的情况)。

但是,accepted answer 的一部分让我感到困惑,因为它开始模糊谈论手机浏览器和谈论 Phonegap 应用之间的界限。

我不清楚的是,Android 上使用 Phonegap 的应用是否使用与手机内置浏览器相同的缓存。 Phonegap 本质上是现有浏览器工具的扩展,还是它自己独立的独立和自包含浏览器?

至关重要的是,如果用户清除浏览器中的缓存,这会影响基于 Phonegap 安装的应用吗?

【问题讨论】:

App Storage 仅对您的应用程序缓存/内容/数据关闭。如果您清理浏览器的缓存,它不会对应用程序的数据库本地存储执行任何操作。但是,如果您在应用程序管理中清除缓存/数据(例如在 Android 上),您的数据就会丢失。这两样东西都保持着不同的分开的存储空间。 【参考方案1】:

由于 Phonegap 使用 Webiview 呈现您的应用程序:WebView and Phonegap。

出于安全原因,每个使用WebView 的应用程序都有自己的缓存和历史记录。 “没有用户或操作系统希望第三方应用程序访问此类数据”。 因此,简而言之,您的应用将在其缓存文件夹中保留自己的历史记录和数据,并在以下情况之一被删除:

用户手动删除了它们。 用户使用了应用设置屏幕并将其删除。 应用已卸载。

阅读更多相关信息。看看 WebView 缓存:Cookie and window management

【讨论】:

所以如果我将 Android 的默认网络浏览器移至 Firefox,PhoneGap 应用程序仍将访问我的 localStorage 吗? 是的,浏览器应用应该与你自己的应用完全隔离。【参考方案2】:

不行,在应用内浏览器中创建的缓存只能通过以下方法删除:

window.localStorage.removeItem("key");

window.localStorage.clear();

或应用卸载

或应用程序管理器中的手动操作(删除数据/缓存)。

但最好的答案是自己做一个实验,看看会发生什么。

【讨论】:

【参考方案3】:

是的,它是独立的,但有时您需要将某种变量传递给 In App Browser。它使编码更容易将 ls 项目从当前的 web 视图传递到另一个,如 ios 中。

这是我在 PhoneGap 中所做的

我使用 InAppBrowser executeScript() 将当前 webviews localStorage 的副本传递给另一个。

//add the listener to detect when the page loads after inappbrowser is called into view
ref.addEventListener('loadstop', function()
     ref.executeScript(code: 'SetInAppBrowserLocalStorage(\''+localStorage+'\');');
);

//In your inAppBrowser page you create a function that  will get called on loadStop
//This will pass "all" the contents of the main webviws localStorage to the webview 
//created by InAppBrowser
function SetInAppBrowserLocalStorage(localStorageThatWasPassed)
    localStorage = localStorageThatWasPassed;
;

您也可以在用户离开该视图之前清除由 SetInAppBrowserLocalStorage() 创建的 localStorage。

100% 测试和工作 :)...如果您需要更多帮助,请告诉我

***更新*****

这仍然有效......但不再一致了。经过多次测试,我意识到这根本不是要走的路。有时,在创建 inappbrowser 实例时,数据传递的速度不够快。我通过那里的问题跟踪器与科尔多瓦人交谈,他们告诉我这不是一种安全的做事方式……我明白了……但我对他们的回应是,如果我只想在页面之间传递 ls 变量怎么办在我的应用程序中..那些甚至无法从互联网访问......老实说,我不明白为什么 ls 项目不能像在 iOS 和其他网络中一样在应用程序中全局访问。如果有人有更好的解决方案,我很想听听。

【讨论】:

反过来呢?我们可以将变量从 inappbrowser 传递回父级吗? 是的。您可以使用我从这里学到的巧妙技巧将数据作为 URL 参数传回:groups.google.com/forum/#!msg/phonegap/REjk8GrlWrQ/hTWfzIpuke0J【参考方案4】:

通过在您的 mainActivity 中进行此设置(扩展 Droidgap。)

  super.appView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);

我们正在让我们的应用不存储缓存。

【讨论】:

以上是关于Android 设备上 Phonegap 应用程序的本地存储是不是与内置浏览器分开?的主要内容,如果未能解决你的问题,请参考以下文章

Android 设备上的 PhoneGap 蓝牙插件

Android 设备上 Phonegap 应用程序的本地存储是不是与内置浏览器分开?

PhoneGap 应用程序 - JSONP 请求发生在浏览器中,但不在设备上(Android)

Android phonegap 应用程序在三星 Galaxy 设备上存在 SQlite 和本地存储问题

PhoneGap 应用程序在 android 设备中仅显示白屏

Phonegap android ajax调用在浏览器中工作,而不是在移动设备上