Adobe Flex(移动):StageWebView 和 HTML5 功能:window.localStorage 为



我使用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上进行本地存储。(尚未测试(

最新更新