Sending email in Ionic app results in following error: TypeError: $cordovaEmailComposer.isAvailable is not a function

Sending email in Ionic app results in following error: TypeError: $cordovaEmailComposer.isAvailable is not a function

我正在开发一个 Ionic Android/iOS 应用程序,该应用程序主要用于扫描条形码,然后通过电子邮件将包含所有扫描件的 CSV (.txt) 附件发送到通讯组。此应用程序使用 ngCordova + Cordova Email Composer 插件 (cordova-plugin-email-composer) 来实现电子邮件功能。在 Android(Nexus 5 上的 6.0.1)中启动电子邮件发送后,我收到以下控制台错误:

TypeError: $cordovaEmailComposer.isAvailable is not a function

所有其他进程似乎都正常工作(例如,正确的平台相关文件路径生成、附件格式和生成)并且 ngCordova + Cordova 条码扫描器插件 (phonegap-plugin-barcodescanner) 正常工作。

我确实遇到了 Cordova Email Composer v0.8.3 的一些问题,总是在 Android 中的 .isAvailable() 上返回 'false',但是我使用 v0.8.2 成功解决了这个问题。两个版本都会出现这个新问题。

请参阅下文,了解包含问题代码的 Angular 服务部分。 scanData 是一个简单的服务,临时保存扫描信息,包括路径和所有扫描的数组。 processFile 是处理所有文件处理(例如保存、加载、删除、动态生成文件名、确定正确的文件路径)的服务。

angular
    .module('app')
    .factory('emailService', ['$ionicPlatform', '$ionicPopup', '$ionicHistory', '$cordovaEmailComposer', 'scanData', 'processFile', emailService]);

function emailService($ionicPlatform, $ionicPopup, $cordovaEmailComposer, $ionicHistory, scanData, processFile) {
  var path = scanData.filePath,
      file = scanData.fileName;

    var service = {
    send: send
  };

  return service;

//------------------------------

  /**
   * Send email
   */
  function send() {
    processFile.save('csv')
      .then(function () {
        console.info('CSV file saved.');

        sendEmail();

      }, function (error) {
        console.error(error);
        //TODO: handle failed save attempt
      });
  }

  /**
   * Invoke cordova email composer to open email client and create pre-defined draft with attachment.
   */
  function sendEmail() {
    console.info('Sending email...');

    $ionicPlatform.ready(function () {
      $cordovaEmailComposer
        .isAvailable()    //ERROR OCCURS HERE
        .then(function () {
          console.info('Email app available.');

          var attachmentPath = getAttachmentPath();

          console.info('Attachment path: ' + attachmentPath);

          var email = {
            to: 'foo@bar.com',
            attachments: [ attachmentPath ],
            subject: 'Incoming Scan',
            body: 'See attached.'
          };

          $cordovaEmailComposer
            .open(email)
            .then(null, function () {
              clearDataPopup();
            });

        }, function () {
          console.warn('Email app not available.');
        });
    });
  }

此外,所有 components/dependencies 都是最新的,而我 运行 ionic state reset 没有任何变化。我还没有机会在 iOS 上进行测试,但一旦我可以这样做就会更新问题。 Android 是目前最重要的平台,所以我暂时关注它。

这很可能只是我忽略的一些愚蠢的小东西,但我目前不知所措。

您的依赖顺序不匹配。记住一件事,你在 DI 内联数组中注入依赖项的顺序确实添加了你应该在控制器工厂函数中获得它们各自的实例一个相同数量的参数。您 $ionicHistory 错过了在控制器工厂功能的第 3 位注入。

.factory('emailService', ['$ionicPlatform', '$ionicPopup', '$ionicHistory', '$cordovaEmailComposer', 'scanData', 'processFile', emailService]);
                                                      //VVVVV//this was missing
  function emailService($ionicPlatform, $ionicPopup, $ionicHistory, $cordovaEmailComposer, $ionicHistory, scanData, processFile) {

因为缺少参数 $cordovaEmailComposer 持有 $ionicHistory

的引用