为什么在使用Ionic Framework的健康工具插件时会出现“plugin_not_installed”错误?

15

我已经使用Ionic Framework有一段时间了,但最近遇到了这个错误plugin_not_installed,这是针对健康组件插件的。根据我的ionic cordova plugin list输出结果,我知道我已经安装了该插件。

$ ionic cordova plugin list
> cordova plugin ls
com.telerik.plugins.healthkit 0.5.5 "HealthKit"
cordova-plugin-apprate 1.3.0 "AppRate"
cordova-plugin-badge 0.8.5 "Badge"
cordova-plugin-device 1.1.4 "Device"
cordova-plugin-dialogs 1.3.4 "Notification"
cordova-plugin-globalization 1.0.8 "Globalization"
cordova-plugin-google-analytics 1.8.3 "Google Universal Analytics Plugin"
cordova-plugin-inappbrowser 1.7.2 "InAppBrowser"
cordova-plugin-ionic-webview 1.1.16 "cordova-plugin-ionic-webview"
cordova-plugin-local-notification 0.9.0-beta.1 "LocalNotification"
cordova-plugin-splashscreen 4.0.3 "Splashscreen"
cordova-plugin-statusbar 2.3.0 "StatusBar"
cordova-plugin-whitelist 1.3.1 "Whitelist"
ionic-plugin-keyboard 2.2.1 "Keyboard"

我的代码被包装在platform.ready()中,所以我知道一切都已经加载完毕。 我也有我的健康工具包代码,在healthKit.available()healthKit.requestAuthorization()中没有错误。

getWeight.then(function () {
    alert("Healthkit is ready!");
    alert(weight);
    healthKitReady = true;
 }).catch(function(err) {
     if (err) {
         console.log(err); // This is where the error is returned.
     }
  });

函数 getWeight 如下:

const getWeight = new Promise(function(resolve, reject) {
    var error;
    healthKit.readWeight({
        unit: "lb"
    }).then(function (out) {
        weight = Math.round(out.value);
        alert("weight: " + weight);
        resolve(weight);
    }, function (err) {
        error = err;
        reject(error);
    });
});

以防万一,如果这是版本问题,以下是Ionic信息的输出:

cli packages: (/usr/local/share/.config/yarn/global/node_modules)

    @ionic/cli-utils  : 1.19.0
    ionic (Ionic CLI) : 3.19.0

global packages:

    cordova (Cordova CLI) : 7.1.0 

local packages:

    @ionic/app-scripts : 3.1.4
    Cordova Platforms  : ios 4.5.4
    Ionic Framework    : ionic-angular 3.9.2

System:

    ios-deploy : 1.9.2 
    ios-sim    : 6.1.2 
    Node       : v8.9.1
    npm        : 2.15.12 
    OS         : macOS High Sierra
    Xcode      : Xcode 9.2 Build version 9C40b 

Environment Variables:

    ANDROID_HOME : not set

Misc:

    backend : pro
6个回答

38
如果你来到这里发现什么都不起作用,不要担心,这不是你的错。
你可能已经按照官方文档执行了以下两个命令来安装插件:
$ ionic cordova plugin add <your plugin>
$ npm install --save @ionic-native/<your plugin>

您还将插件添加到了app-module.ts文件中:

@NgModule({
    ...

    providers: [
        ...
        Your plugin
        ...
    ]
...
})

您已经在调用类的构造函数中正确导入并注入了插件。

您甚至等待deviceReady事件来开始使用您的插件:

this.platform.ready().then(() => {
    //Use plugin now
});

如果你仍然收到“plugin_not_installed”错误,可能发生的一件事是,尽管有多个MB的节点和配置文件,但插件是在项目创建之前最近添加的。当你添加插件时,它已经下载了存储库中最新版本的插件,并且对于你的项目中安装的某些平台(如Android或iOS),该插件需要比你现在拥有的Cordova版本更高的版本。请再次输入第一个命令:

$ ionic cordova plugin add <your plugin>

请仔细查看输出内容。看起来一切都正常,但如果你向上滚动,你可能会发现一个错误,说你下载的插件需要Cordova android(或ios)版本X,而你的Cordova android(或ios)版本是Y,其中Y < X。例如:

Fetching plugin "phonegap-plugin-push@~2.1.0" via npm
Installing "phonegap-plugin-push" at "2.1.0" for android
Plugin doesn't support this project's cordova version. cordova: 7.0.2, failed version requirement: >=7.1.0
Skipping 'phonegap-plugin-push' for android

更糟糕的是,插件已经部分添加,可能存在于根插件文件夹和config.xml中,并列在cordova plugin list命令输出中,但它不存在于platform_www\plugins文件夹中。如果是这种情况,您需要更新相关平台。而cordova platform update已被弃用,所以现在您需要执行以下操作:
ionic cordova platform remove android
ionic cordova platform add android@X

X代表插件所需的版本或更高版本,例如“7.1.0”。

现在您需要适当地重新安装该插件:

$ ionic cordova plugin add <your plugin>
$ npm install --save @ionic-native/<your plugin>

我们还没有完成。在Android设备上运行时,您可能会遇到以下错误:

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:processDebugManifest'.
> Manifest merger failed : uses-sdk:minSdkVersion 16 cannot be smaller than version 19 declared in library [:CordovaLib]

在更新平台后,一些新的代码需要更高的新 minSDK。对于 Ionic,您需要在 config.xml 中更改此设置:

<preference name="android-minSdkVersion" value="19" />

希望现在你没问题了。Cordova 在依赖管理方面确实很糟糕。而且文档写得好像每个人都有最新的一切。


7
作为一名Android和iOS本地开发者,我很清楚多平台倡导者所承诺的轻松无缝之旅是虚假的。 - Josh

13

在使用导入类的对象之前,请使用platform.ready()函数:

constructor(public qrScanner: QRScanner) {
                
                // solve the problem - "plugin not installed".
                platform.ready().then(()=>{
                  this.qrscanner();
                })
                
}

在尝试其他任何操作之前,这是您想要确保包含在引用Cordova插件的任何位置的代码。首先放置它,进行测试,然后查看是否仍然存在问题。 - Various Artist

3
这是一个令人困惑的问题,因为它没有详细说明原因。根据我的观察,可能是Android版本和插件不兼容的问题。对于我的情况,Ionic已生成了Android@7.0.0,而在这种情况下的插件"phonegap-plugin-push"需要版本Android@7.1.0。
如何获得这些信息?当你运行“ionic cordova build android”命令时,会显示出现的错误消息及其信息。
所以,我通过以下步骤解决了问题:
1、运行“ionic cordova platform rm android”。
2、手动删除config.xml。
3、运行“ionic integrations enable cordova --add”来生成新的config.xml。
4、(如果插件不多)重新安装所有插件。
5、如果需要插件,则运行“ionic cordova platform add android@”。
但是,需要重新安装所有插件才能确保一切正常。如何适当地重新安装插件?
重新安装插件的两个步骤:
卸载插件的两个命令:
1、ionic cordova plugin rm 2、npm uninstall --save 安装插件的两个命令:
1、ionic cordova plugin add 2、npm install --save 希望这种方法能帮助您正确地继续项目。无论如何,这对我起作用了。
重要提示:
对于我之前的介入,我认为它描述了通过验证所有插件重新初始化ionic应用程序的解决方案。因为我的应用在真实设备上有漏洞,没有请求API可用,并且这与一个插件的安装不良有关,在这种情况下是“Document-viewer”插件。尽管在“DevApp”的控制台上的错误与“推送通知”插件相关,而不是“Document-viewer”插件。
然而,在这两个插件之间,“Document-viewer”插件没有安装好,“push-notification”插件已成功安装,这一点可以证明。当我重新安装所有插件以重置应用程序时,我的API请求在实际设备上完美无缺且包括工作通知,而在“DevApp”上我仍然遇到“push”的“plugin_not_installed”错误。
总之,我认为试图重新安装插件不会解决问题,因为我认为测试应用程序不支持所有插件,就像在这里使用“DevApp”时那样。

解决方案 如果您的应用程序有错误提示,告诉您所有插件未正确安装,请尝试在真实设备上启动它。


2

我也遇到了这个问题。问题出在插件的版本不匹配上。解决方法是通过shift+delete删除node_module/package-lock.json文件夹。使用npm i重新安装所有的node modules,然后再移除平台ionic cordova platform remove android,接着添加平台并安装所有必需的插件。


这对我没有起作用。 - Pratik Agarwal

1
我遇到了与iBeacon插件相同的错误。 尝试使用Xcode构建应用并将其安装在iPhone上。 我认为问题出在cordova上,对于某些插件(如iBeacon)。当我使用“ionic serve -c”运行项目并在Ionic DevApp上打开它时,cordova会返回一个错误“plugin_not_installed”。 因此,我尝试使用命令“ionic cordova build ios --prod”在xcode上构建应用程序,启动在“/platform/ios”生成的.xcworkspace文件并在iPhone上安装它。 (记得在xcode中签署应用程序并更改Bundle Identifier)! 有关更多信息,请参见https://ionicframework.com/docs/intro/deploying/

1
谢谢您的回复,但不幸的是它似乎无效。 - arodebaugh

0

不得不删除并重新创建 Android 文件夹,现在它按预期工作了。就这么简单。

希望这对其他开发人员有用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接