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



我正致力于将自定义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服务包装器,如下所述。

我已经创建了一个工厂来处理这个。

/lib/调查/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中工作?

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

$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;
}

最新更新