首页 文章

如何在Angular / Ionic服务中使用自定义Cordova插件方法

提问于
浏览
4

我正在努力将自定义Cordova插件集成到Ionic应用程序中 . 我们有第三方创建了一个Cordova插件来与蓝牙设备连接 . 运行 cordova platform ls 表示插件已正确安装:

$ cordova plugin ls
> com.sitename.product 0.0.0 "DeviceProbe"

该插件包含一个 probe.js 文件,其中包含连接,读取,轮询和其他操作的方法 .

/plugins/com.sitename.product/www/probe.js

var callNative = function(service, action, success, error, args) {
    if(args === undefined) args = [];
    cordova.exec(success, error, service, action, args);
};

var thermProbe = {

    // Methods here

};

module.exports = thermProbe;

为了在我们的控制器中使用插件,我需要创建一个Angular服务包装器,如described here .

我已经创建了一个工厂来处理这个问题 .

/lib/probe/probe.js

(function() {

    'use strict';

    var serviceId = 'Probe';
    angular.module('thermProbe').factory(serviceId, ['$q', Probe]);

    function Probe($q) {

        var service = {
            'connect': connect,
            'disconnect': disconnect,
            'getReading': getReading,
            'getName': getName, 
            'getHigh': getHigh,
            'getLow': getLow,
            'pollReading': pollReading,
            'stopPolling': stopPolling,
            'isPolling': isPolling
        };

        return service;

        // Method wrappers

        function connect() {

            var q = $q.defer(); 

            if($window.cordova){
              cordova.plugins.thermProbe.connect(function (result) {
                q.resolve(result);
              }, function (err) {
                q.reject(err);
              });
            }
            return q.promise;

        }

    }

})();

Probe 服务注入控制器工作正常 . 当我在我的设备上运行它(使用 ionic run android )时,我收到以下错误:

TypeError: Cannot read property 'connect' of undefined

追溯到包含 cordova.plugins.thermProbe.connect() 的行 .

我也尝试使用 cordova.plugins.probe.connect() 但收到同样的错误 .

如何让 /plugins/com.sitename.product/www/probe.js 中的方法在 /lib/probe/probe.js 中工作?

1 回答

  • 1

    经过多次试验和错误(和 console.log )我能够解决这个问题 .

    $window 对象具有包含所有必需方法的 probe 对象 . 我猜 probe 名称来自Cordova插件配置 .

    plugin.xml

    <js-module src="www/probe.js" name="probe">
      <clobbers target="probe" />
    </js-module>
    <platform name="ios">
      <config-file target="config.xml" parent="/*">
        <feature name="probe">
          <param name="ios-package" value="productName"/>
        </feature>
      </config-file>
      ...
      ...
    </platform>
    <platform name="android">
      <config-file target="res/xml/config.xml" parent="/*">
        <feature name="probe">
          <param name="android-package" value="com.sitename.productName"/>
          <param name="onload" value="true" />
        </feature>
      </config-file>
      ...
      ...
    </platform>
    

    要使用这些方法:

    function connect() {
    
      var q = $q.defer(); 
    
      if($window.probe){
        $window.probe.connect(function (result) {
          q.resolve(result);
        }, function (err) {
          q.reject(err);
        });
      }
    
      return q.promise;
    
    }
    

相关问题