Angular6 + Cordova 问题:cordova未加载,deviceready事件未触发
解决Cordova deviceready事件未触发导致API无法加载的问题
你遇到的核心问题是deviceready事件完全未触发,这直接导致Cordova API无法初始化,依赖navigator.mediaDevices的组件自然失效。结合你的代码和操作步骤,我整理了几个关键排查点和修复方案:
1. 紧急修复:修正cordova.js引入的语法错误
看你index.html里的脚本引入代码:
<script src=”cordova.js”></script>
这里用了中文全角引号,浏览器根本无法识别这个路径,直接导致cordova.js加载失败,deviceready事件自然不会触发。立刻改成英文半角引号:
<script src="cordova.js"></script>
2. 确保Cordova核心文件存在于www目录
你执行了rm -rf cordova/www/*清空目录,再把Angular构建产物放进去,但Cordova的cordova.js是在cordova prepare阶段才会复制到www根目录的。建议调整你的构建流程:
npm install -g cordova cordova create cordova cd cordova && cordova platforms add android # 先执行prepare生成cordova核心文件 cordova prepare android # 再清空并复制Angular产物 rm -rf cordova/www/* ng build --prod --aot --output-path=cordova/www # 最后构建安卓应用 cd cordova && cordova build android
3. 优化deviceready事件绑定时机
你的事件绑定代码没问题,但可以把它放在DOM加载完成后执行,同时建议将Angular的启动逻辑也延迟到deviceready之后,彻底避免时序问题:
修改index.html的事件绑定
<base href="./"> <script src="cordova.js"></script> <script> window.isready = false; // 先等DOM加载完成再绑定deviceready document.addEventListener('DOMContentLoaded', function() { document.addEventListener('deviceready', ready, false); }); function ready(){ alert('deviceready触发成功!'); console.log('deviceready触发成功!'); window.isready = true; } </script>
修改Angular的main.ts(关键)
把Angular应用的启动逻辑放在deviceready事件回调里,确保Cordova API完全初始化后再启动应用:
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; import { AppModule } from './app/app.module'; document.addEventListener('deviceready', () => { platformBrowserDynamic().bootstrapModule(AppModule) .catch(err => console.error(err)); }, false);
4. 检查Cordova版本兼容性
你使用的cordova-android@7.0.0版本较旧,可能和新版本插件、Angular存在兼容性问题。建议升级到更稳定的版本:
# 移除旧平台 cordova platform remove android # 添加9.x稳定版(适配大多数插件) cordova platform add android@9.1.0
5. 确认白名单配置
虽然你安装了cordova-plugin-whitelist,但要确保config.xml里有正确的白名单规则:
<access origin="*" /> <allow-intent href="http://*/*" /> <allow-intent href="https://*/*" /> <allow-navigation href="*" />
完成以上调整后,重新构建并测试应用,deviceready事件应该能正常触发,navigator.mediaDevices相关功能也会恢复正常。
内容的提问来源于stack exchange,提问作者dc-p8
相关产品推荐
相关产品推荐

