Ionic 2 运行时错误:Cordova 未定义

Posted

技术标签:

【中文标题】Ionic 2 运行时错误:Cordova 未定义【英文标题】:Ionic 2 Runtime Error: Cordova is undefined 【发布时间】:2018-04-15 10:56:44 【问题描述】:

当我尝试在浏览器中运行 Ionic v3.14.0 混合应用程序时,我收到运行时错误“Cordova 未定义”。我按照this 帖子的答案运行了以下命令

ionic cordova platform add browser
ionic cordova run browser

上面的第一个命令将Platforms/browser 添加到我的项目和它下面的文件夹结构中,我可以在Platforms/browser/www 下找到cordova.js。 但是,当我运行上面的第二个命令时,会打开一个空白的 chrome 浏览器实例(尽管我的默认设置是 IE)并且保持空白而不显示应用程序。下面是来自终端的堆栈跟踪。

PS C:\Data\Per\Biz\Ionic\MyApp> ionic cordova run browser
Running app-scripts build: --platform browser --target cordova
[00:47:27]  build dev started ...
[00:47:27]  clean started ...
[00:47:27]  clean finished in 12 ms
[00:47:27]  copy started ...
[00:47:27]  deeplinks started ...
[00:47:28]  deeplinks finished in 113 ms
[00:47:28]  transpile started ...
[00:47:31]  transpile finished in 3.71 s
[00:47:31]  preprocess started ...
[00:47:31]  preprocess finished in 1 ms
[00:47:31]  webpack started ...
[00:47:32]  copy finished in 4.39 s
[00:47:41]  webpack finished in 9.49 s
[00:47:41]  sass started ...
[00:47:42]  sass finished in 1.40 s
[00:47:42]  postprocess started ...
[00:47:42]  postprocess finished in 16 ms
[00:47:42]  lint started ...
[00:47:42]  build dev finished in 15.21 s
> cordova run browser
Error loading cordova-browser

Running command: cmd "/s /c "C:\Data\Per\Biz\Ionic\MyApp\platforms\browser\cordova\build.bat""

Cleaning Browser project
[00:47:46]  lint finished in 4.18 s
Running command: cmd "/s /c "C:\Data\Per\Biz\Ionic\MyApp\platforms\browser\cordova\run.bat --nobuild""
Static file server running @ http://localhost:8000/index.html
CTRL + C to shut down
200 /index.html (gzip)
200 /cordova.js (gzip)
200 /build/main.js (gzip)
200 /build/polyfills.js (gzip)
200 /build/main.css (gzip)
200 /cordova_plugins.js (gzip)
200 /plugins/cordova-plugin-device/www/device.js (gzip)
200 /plugins/cordova-plugin-device/src/browser/DeviceProxy.js (gzip)
200 /plugins/com.salesforce/www/com.salesforce.plugin.oauth.js (gzip)
200 /plugins/com.salesforce/www/com.salesforce.plugin.network.js (gzip)
200 /plugins/com.salesforce/www/com.salesforce.plugin.sdkinfo.js (gzip)
200 /plugins/com.salesforce/www/com.salesforce.plugin.smartstore.js (gzip)
200 /plugins/com.salesforce/www/com.salesforce.plugin.smartstore.client.js (gzip)
200 /plugins/com.salesforce/www/com.salesforce.plugin.sfaccountmanager.js (gzip)
200 /plugins/com.salesforce/www/com.salesforce.plugin.smartsync.js (gzip)
200 /plugins/com.salesforce/www/com.salesforce.util.bootstrap.js (gzip)
200 /plugins/com.salesforce/www/com.salesforce.util.event.js (gzip)
200 /plugins/ionic-plugin-keyboard/www/browser/keyboard.js
200 /plugins/com.salesforce/www/com.salesforce.util.exec.js (gzip)
200 /plugins/com.salesforce/www/com.salesforce.util.logger.js (gzip)
200 /plugins/com.salesforce/www/com.salesforce.util.promiser.js (gzip)
200 /plugins/com.salesforce/www/com.salesforce.util.push.js (gzip)
200 /plugins/cordova-plugin-splashscreen/www/splashscreen.js (gzip)
200 /plugins/cordova-plugin-splashscreen/src/browser/SplashScreenProxy.js (gzip)
200 /config.xml (gzip)
404 /screen
200 /build/vendor.js (gzip)
200 /assets/icon/favicon.ico (gzip)

我在 index.html 中包含了<script src="cordova.js"></script>

以下是我声明 Cordova 的 ts 文件: data-service.ts

import  Injectable  from '@angular/core';
import  Http, Response  from '@angular/http';
import 'rxjs/add/operator/map';

declare let cordova:any;

/*
  Generated class for the DataServiceProvider provider.

  See https://angular.io/guide/dependency-injection for more info on providers
  and Angular DI.
*/
@Injectable()
export class DataServiceProvider 
  indexSpecs:any[];
  soupName = "menuItems"; 

  constructor(public http: Http) 
    console.log('Hello DataServiceProvider Provider');
  

  getMainMenu()
    return this.http.get('assets/data/mainmenu.json')
    .map((response:Response)=>response.json().Categories);
  

  getMainMenuItems() 
    this.registerSmartStoreSoup();
  

  registerSmartStoreSoup() 
    this.indexSpecs = [path:"Name",type:"string",path:"Id",type:"string"];
    cordova.require("com.salesforce.plugin.smartstore").registerSoup(this.soupName,this.indexSpecs,this.successCallback,this.errorCallback);
  

  successCallback() 
    console.log("Soup "+this.soupName+" Created Successfully");
  

  errorCallback(err) 
    console.log("Error Creating "+this.soupName+":"+err)
  


getMainMenuItems() 在 app.component.ts

的构造函数中调用
constructor(public platform: Platform, public statusBar: StatusBar, public splashScreen: SplashScreen, public dataService: DataServiceProvider) 
    this.initializeApp();

    this.dataService.getMainMenuItems();

我怀疑上面堆栈跟踪中的输出"Error loading cordova-browser"。但不确定这里的问题。有人可以帮助我吗,我在这里被打了一段时间。

【问题讨论】:

您是否尝试在浏览器中运行您的应用程序?尝试 ionic serve 命令 @PrithiviRaj:感谢您的回复。当我尝试使用ionic serve 运行时,我得到Runtime Error: 'cordova' is undefined 我通过升级到 Cordova 6.5.0 解决了堆栈跟踪中的问题 "Error loading cordova-browser"。但是,当我尝试 ionic cordova run browser 时,我仍然在 Chrome 中看到一个空白页 按照解决方案here 我可以使用ionic cordova run browser 在浏览器中打开应用程序。但是,当我尝试ionic serve -l 时,我得到运行时错误'cordova' is undefined。目前我只在平台下添加了浏览器。任何帮助将不胜感激。 【参考方案1】:

您所指的链接我猜是使用 Ionic 1。请尝试以下步骤。

    删除节点模块文件夹并运行npm install -g ionic@latest 直接运行ionic serve在浏览器中运行。 如果你想运行设备npm install -g cordova,请安装cordova

请参考official documentation for commands

【讨论】:

再次感谢您的回复。我仍然遇到与ionic serve -l 一起运行的相同错误'cordova' is undefined。我正在运行我认为是最新的 Ionic 3.14.0。 我应该在 1npm install -g ionic@latest` 之后安装项目依赖项吗? 是更新离子版本升级后更新项目依赖 完成。 ionic serve -l ==> 'cordova' 未定义【参考方案2】:

com.salesforce.plugin 不支持浏览器。它只支持移动平台(即androidios)。

【讨论】:

感谢您的回复。我不需要为浏览器构建。我只需要为 ios 和 android 构建。但是,我使用ionic serve -l 来预览应用程序上下文中的更改。但是在添加cordova.require 之后,我得到一个错误'cordova' is undefined。所以我认为将浏览器添加为平台是一种解决方法。在这种情况下,我想要的只是在应用程序外观中的浏览器中预览应用程序,我相信我必须使用 ionic serve -l 但这被“cordova”阻止是未定义的错误。你能建议解决这个问题吗? 如果你只是想预览 UI,然后在“cordova undefined error”页面上。你会在右上角找到“关闭”选项。这将关闭错误对话框,您的 UI 将再次可见。希望这会有所帮助! 感谢您的回复。我还需要测试涉及 salesforce 的功能。根据我的发现,ionic serve -l 无法提供更多帮助,因为它不支持科尔多瓦。所以我开始使用android模拟器。我对使用以下错误设置模拟器感到震惊:emulator:ERROR: x86 emulation currently requires hardware acceleration! Please ensure Intel HAXM is properly installed and usable. CPU acceleration status: HAXM is not installed on this machine。 Android SDK 管理器说Intel x86 Emulator Accelerator (HAXM installer) 6.2.1 Not compatible with windows。有什么想法吗? 检查系统的 BIOS,虚拟化需要启用才能使 HAXM 工作。 感谢您的评论。我从 Intel 下载了适用于 Windows 的 HAXM,现在可以使用了。

以上是关于Ionic 2 运行时错误:Cordova 未定义的主要内容,如果未能解决你的问题,请参考以下文章

Cordova 无法使用 --target 读取未定义的属性“名称”

Cordova / Ionic:在设备上模拟或运行时未处理 $http 请求

运行“ionic cordova platform add ios”时出错

IONIC 3 [ERROR] 运行 cordova run android 时发生错误(退出代码 1)

ionic 运行 ios 时,引发错误正常 arm64、armv7

cordova-plugin-facebook4 ionic facebookConnectPlugin 未定义