javascript – 在Ionic应用程序中发送电子邮件会导致以下错误:TypeError:$cordovaEmailComposer.isAvailable不是函数

我正在开发一个主要用于扫描条形码的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.');
        });
    });
  }

此外,所有组件/依赖项都是最新的,我已经运行离子状态重置而没有任何变化.我还没有机会在iOS上测试,但一旦我能这样做就会更新问题. Android是目前最重要的平台,所以我现在专注于它.

这很可能只是我忽视的一些愚蠢的小事,但我现在不知所措.

最佳答案 你的依赖序列不匹配.记住一件事,在DI Inline数组中注入依赖关系的顺序确实增加了你应该在控制器工厂函数内获得相同数量的参数.您忘记了$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的引用

点赞