安卓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配置:
然后在Sencha Touch的<preference name="SplashScreenDelay" value="3000" /> <preference name="AutoHideSplashScreen" value="true" /> <preference name="ShowSplashScreenSpinner" value="false" /> <preference name="SplashScreen" value="screen" />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
相关产品推荐
相关产品推荐

