You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

安卓Chrome 65版本更新后,Sencha Touch+Cordova混合应用异常咨询

针对Chrome 65后Sencha Touch+Cordova安卓混合应用异常的解决方案

我之前帮好几个开发者排查过类似的兼容问题,Chrome 65确实对浏览器的安全策略和缓存机制做了不少调整,刚好命中了Sencha Touch和Cordova老配置的痛点。给你整理了针对性的解决办法:

一、应用无法正常运行的修复方案

这个问题主要是Chrome 65严格执行了Content Security Policy(CSP),同时对ES语法的兼容性要求更严导致的:

  • 更新CSP配置:在Cordova项目的config.xml里修改Content-Security-Policy meta标签,允许Sencha Touch必需的资源加载和eval操作(老版本Sencha Touch依赖这个)。示例配置:
    <meta http-equiv="Content-Security-Policy" content="default-src 'self' data: gap: https://ssl.gstatic.com 'unsafe-eval'; style-src 'self' 'unsafe-inline'; media-src *; img-src 'self' data: content:;">
    
  • 升级Sencha Touch版本:如果你的项目用的是2.x早期版本,建议升级到最新稳定版(比如2.4.2),官方在后续版本里修复了大量现代浏览器的兼容问题,能直接规避不少语法和API冲突。
  • 修复ES语法问题:检查代码里有没有使用Chrome 65不再兼容的过时ES5写法,比如某些非标准的函数扩展,替换成标准语法即可。

二、点击事件触发闪屏重现的修复方案

这个问题核心是Chrome 65修改了页面缓存机制,导致Cordova WebView误触发闪屏,加上Sencha Touch的事件委托可能放大了这个问题:

  • 严格控制闪屏显示逻辑:在config.xml里明确闪屏的触发时机,确保只有启动时才显示,同时在应用启动完成后手动隐藏:
    首先调整config.xml配置:
    <preference name="SplashScreenDelay" value="3000" />
    <preference name="AutoHideSplashScreen" value="true" />
    <preference name="ShowSplashScreenSpinner" value="false" />
    <preference name="SplashScreen" value="screen" />
    
    然后在Sencha Touch的launch事件里手动隐藏闪屏,避免后续被意外唤起:
    Ext.application({
        name: 'MyApp',
        launch: function() {
            // 确保闪屏完全隐藏
            if (typeof navigator.splashscreen !== 'undefined') {
                navigator.splashscreen.hide();
            }
            // 你的其他启动逻辑
        }
    });
    
  • 优化事件绑定方式:避免使用全局事件委托(比如绑定到body或document上),改成绑定到具体组件上,减少浏览器的异常触发:
    // 不推荐:全局事件委托容易触发意外行为
    Ext.getBody().on('tap', function() { /* ... */ });
    
    // 推荐:绑定到具体组件
    Ext.create('Ext.Button', {
        text: '操作按钮',
        listeners: {
            tap: function() { /* 你的逻辑 */ }
        },
        renderTo: Ext.getBody()
    });
    
  • 禁用WebView缓存:在AndroidManifest.xml里给WebView设置禁用缓存,避免页面被误判为需要重新加载:
    <application android:hardwareAccelerated="true" ...>
        <activity android:name=".MainActivity" ...>
            <!-- 其他配置 -->
            <meta-data android:name="android.app.webview.settings.cacheMode" android:value="LOAD_NO_CACHE" />
        </activity>
    </application>
    

内容的提问来源于stack exchange,提问作者Prithiviraj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:10:23