我使用FlashDevelop(Flash Builder的伟大且免费的替代品(,它使用Adobe的(最新(开源Flex框架。
我也想开发一个适用于Android和iOS的应用程序。在某些部分,我使用 StageWebView 来显示我不想重写以灵活 AS3 代码的内容。
简而言之:我正处于开发的早期阶段,这是我的第一个弹性移动应用程序。在某些部分,它使用HTML5功能"localStore"(javascript中对象窗口的一部分(来存储一些数据。但是这个功能似乎在flex的webkit浏览器中不可用?我还想知道这是一个典型的 flex 问题,还是在部署应用程序时也存在?在移动设备上加载 HTML 部件时(例如在移动 Safari 中(,不会出现此问题。
此外,当本地存储功能不可用时,它将切换回cookie。但这也不能正常工作。在所有其他浏览器中都没有问题,即使在IE中也是如此。饼干的结果:varname=undefined; expires=Thu, 03 May 2012 01:01:41 GMT.
这是怎么回事?
以下是一些Javascript代码:
// Picked up from: https://github.com/carhartl/jquery-cookie
// Usage: http://www.electrictoolbox.com/jquery-cookies/
jQuery.cookie = function (key, value, options) {
// key and at least value given, set cookie...
if (arguments.length > 1 && String(value) !== "[object Object]") {
options = jQuery.extend({}, options);
if (value === null || value === undefined) {
options.expires = -1;
}
if (typeof options.expires === 'number') {
var days = options.expires, t = options.expires = new Date();
t.setDate(t.getDate() + days);
}
value = String(value);
return (document.cookie = [
encodeURIComponent(key), '=',
options.raw ? value : encodeURIComponent(value),
options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE
options.path ? '; path=' + options.path : '',
options.domain ? '; domain=' + options.domain : '',
options.secure ? '; secure' : ''
].join(''));
}
// key and possibly options given, get cookie...
options = value || {};
var result, decode = options.raw ? function (s) { return s; } : decodeURIComponent;
return (result = new RegExp('(?:^|; )' + encodeURIComponent(key) + '=([^;]*)').exec(document.cookie)) ? decode(result[1]) : null;
};
本地存储:
jQuery.locstore = function(key, val, opt ) {
var ls = window.localStorage,
j = window.JSON,
b = !( !ls || !j );
if( !b )
{ return jQuery.cookie( key, val, opt ); }
// set
if( arguments.length > 1 )
{
var bRem = (val == null ),
v = (bRem || typeof val == 'number' || typeof val == 'string')?val:j.stringify(val);
if( bRem )
{ b = ls.removeItem(key); }
else { b = ls.setItem(key, v); }
return b;
}
// get
var v = ls.getItem(key);
if( v != null && typeof val != 'number' )
try { v=j.parse(v); } catch(e){}
return v;
};
我在这里问它是因为我在网上找不到答案。也许有人给了我解决这个问题的正确方向的线索?
但似乎此功能在 webkit 浏览器中不可用 的柔性
Flex Framework 中没有 webkit 浏览器。Webkit 的一个版本包含在桌面 AIR 运行时中;但这对移动应用程序来说并不重要。
Mobile AIR使用操作系统(Android或iOS(的下划线浏览器引擎进行StageWebView。我不确定具体细节;也不是通过"应用程序中的浏览器"公开的功能,但这里有一个来自文档的引述来确认这一点:
在移动和扩展移动配置文件中的设备上, 类使用设备提供的系统 Web 控件 操作系统。因此,可用的功能和渲染 外观可能因设备而异。
因此,我推测您的问题与Flex或AIR无关,而是与您正在测试的操作系统中的浏览器支持有关。
这些可能对您有所帮助:
http://helpx.adobe.com/air/kb/stagewebview-differences-platforms-air-sdk.html
http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/media/StageWebView.html
http://xperiments.es/blog/en/stagewebviewbridge-comunicacion-entre-actionscript-y-javascript-y-viceversa/
http://coenraets.org/blog/2011/07/using-jquery-in-a-flex-application/(另请参阅上一篇文章。链接位于第一段中。
希望最后两个中的一个可以帮助解决问题/给你一个解决方法。
托德
显然Air的stageWebView不支持localStorage。尽管这不是一个完美的解决方案,但在花了几个月的时间寻找解决方案之后,我用sessionStorage替换了localStorage,并且能够正确加载我的文件。
请记住,sessionStorage 仅适用于 stageWebView 的 loadURL 方法,loadString 没有 localStorage 也没有 sessionStorage。
编辑:会话存储似乎仅在Android中工作。我无法获得本地存储或会话存储以在适用于iOS的Adobe Air中工作。
编辑2:显然二月份的Adobe Air更新允许在Android的Adobe Air上进行本地存储。(尚未测试(