科尔多瓦2.2.0 iOS上 - RequireJS将无法正确加载科尔多瓦(Cordova 2.2

2019-07-03 14:17发布

我目前正在开发使用科尔多瓦(PhoneGap的),骨干网和JQtouch web应用程序。 别的不说,我需要添加事件在用户的日历。

一切工作正常在Android上。 我仍在使用科尔多瓦2.0.0。 (我没有升级到最新版本)。 滚动的作品,导航是确定的,而且我可以在我的日历添加事件!

在iPhone上,它是不同的。 因为我想我的应用程序在iOS 6的工作,我得到了科尔多瓦在我的Mac 2.2.0。 从那时起,我不能添加在日历事件了。 它的工作(在iPhone上)与科尔多瓦2.0.0,但不是现在。

经过调查,我发现cordova.exec()是不确定的

我搜索了很多关于这个问题,但似乎没有人,除了我,遇到了这个问题现在。

下面是与科尔多瓦2.0.0工作,但不能与科尔多瓦2.2.0的代码示例:

calendar.js,对科尔多瓦日历插件。 我没有写它。 在Android上我得到“cordova.exec定义”,而iOS上我得到了另外一个消息。

// Cordova Calendar Plugin
// Author: Felix Montanez 
// Created: 01-17-2012
// Contributors:
// Michael Brooks    

function calendarPlugin()
{
}

calendarPlugin.prototype.createEvent = function(title,location,notes,startDate,endDate)
{
    if('function' == typeof(cordova.exec)) {
        alert("cordova.exec is defined");
    } else {
        alert("cordova.exec is not defined");
    }
    cordova.exec(null,null,"calendarPlugin","createEvent", [title,location,notes,startDate,endDate]);
};

calendarPlugin.install = function()
{
    if(!window.plugins)
    {
        window.plugins = {};
    }    
    window.plugins.calendarPlugin = new calendarPlugin();
    return window.plugins.calendarPlugin;
};

cordova.addConstructor(calendarPlugin.install);

它调用函数createEvent代码(它的工作,因为我得到了先前的警报)

if (confirm('Do you want to add this event in your calendar?')) 
{ 
    calendarPlugin.prototype.createEvent('<%= paramEvent_map %>', 'Geneva', 
        'Convocation', '<%= paramEvent_startDate %>', '<%= paramEvent_endDate %>'); 
}

这个问题的一个可能的来源可能是我升级从科尔多瓦2.0.0到2.2.0科尔多瓦的方式:我只是跟着教程“ 升级科尔多瓦2.1.0项目2.2.0 ”。 如果我做了“从2.0.0到2.1.0”,然后“表2.1.0至2.2.0”?

我会很感激的任何建议,关于这一点,因为我真的不希望重新启动我安装的PhoneGap的。

在Mac上,我与山狮10.8和Xcode的工作4.5,和我测试我的应用程序在iOS 4和6在PC上,我和集锦工作室3和Eclipse 3.7.1的工作,而且我测试在Android 2.3。

--- 编辑:重新安装科尔多瓦2.1.0然后升级到2.2.0 ---

我只是删除我的项目,卸载科尔多瓦和“从头开始”重做一切:

  • 我安装科尔多瓦从2.1.0 他们的网站 。
  • 我升级的Xcode 4.5.2来(推荐)
  • 我创建了我复制我的代码部分一个Xcode项目。
  • 我跟着他们的教程升级从科尔多瓦2.1.0至2.2.0科尔多瓦
  • 我设置“架构”为“ARMv7的,armv7s”和“构建有源体系仅”为“Yes”
  • 我说我需要为日历插件框架:EventKit和EventKitUI

然后我编译并运行在我的iPhone 3(与iOS 6)我的项目,并且尚未定义cordova.exec!

--- 编辑:声明我的日历插件作为一个模块 ---

我直接在科尔多瓦 - 2.2.0.js添加日历插件一些代码(我绝望)。

现在,在科尔多瓦-2.2.0.js,我有以下行:( 我在这里得到了他们 )

define("cordova/plugin/calendarplugin", function(require, exports, module) {
    var exec = require('cordova/exec');

    var calendarPlugin = function() {};

    calendarPlugin.prototype.createEvent = function(title,location,notes,startDate,endDate) {
         exec(null, null, 'calendarPlugin', 'createEvent', [title,location,notes,startDate,endDate]);
    }

    var myCalendarPlugin = new calendarPlugin();
    module.exports = myCalendarPlugin;
});

所以,我不使用cordova.exec()了,但这个:

var exec = require('cordova/exec');

我的日历“插件”文件现在只包含以下行:

var mycalendarplugin = cordova.require("cordova/plugin/calendarplugin");

这就是我如何用我的新的“模块”:

window.mycalendarplugin.createEvent('<%= paramEvent_map %>', 'Geneva', 
'Convocation', '<%= paramEvent_startDate %>', '<%= paramEvent_endDate %>');

而且,奇怪的是,该功能EXEC()被调用!

但是,我得到了以下信息:“ 错误:试图之前调用cordova.exec()‘deviceready’忽略。”当“deviceReady”并没有解雇这应该出现。

可悲的是,这一事件永远不会触发。 所以我现在的问题是略有不同,但仍然存在。

--- 编辑:比较与Android ---

我添加了几行,以监听事件,无论是在Android和iOS:

window.addEventListener('load', function () {
     alert("load triggered");
     document.addEventListener('deviceready', function () {
            alert("PhoneGap is now loaded!");
     }, false);
}, false);

在iOS上,我得到的消息“负荷触发”,而不是“PhoneGap的,现在装”。 在那之后,我仍然无法使用EXEC()。

在Android上,我没有得到任何消息都没有。 但我可以用cordova.exec()没有问题。

--- 编辑:从头开始重做项目 ---

而不是创建我与科尔多瓦2.1.0然后再升级到2.2.0科尔多瓦项目,我试图创建一个示例项目直接与科尔多瓦2.2.0则包括它的日历插件(原始版本)。

它工作完全正常! 随着iOS 6的(这需要从用户的明示autorisation)多一点的代码,我可以在我的日历添加事件。

然而,当我加入我的项目(HTML,CSS,JS文件)的其余部分,我得到了同样的错误:cordova.exec是不确定的。

该负责可能是RequireJS,其可以以不同的方式加载科尔多瓦-2.2.0.js。 它与科尔多瓦2.0.0运作良好,但似乎并没有与2.2.0。

我会尝试看看我是否能RequireJS之前加载科尔多瓦 - 2.2.0.js,并仍然使用一次科尔多瓦被加载。

我会继续为您提供最新:)

Answer 1:

对不起,回答我的问题。

这是我想在我的最后编辑:RequireJS与科尔多瓦2.2.0搞乱

之前,我用这个代码加载科尔多瓦:

require.config({
  paths: {
    cordova: 'libs/cordova/cordova-2.2.0', ...

我的任何脚本它使用科尔多瓦之前,我是写:

define([
  'jquery',
  'cordova',
  ...
], function($) { ... }

在我的index.html,我有:

<script data-main="js/main" src="js/libs/require/require-jquery.js"></script>

并与科尔多瓦2.0.0效果很好! 但与科尔多瓦2.2.0,这是错误的

要解决我的问题:

我摆脱了有关在以前的线路科尔多瓦一切。

  • 没有更多的科尔多瓦在require.config。
  • 没有更多的科尔多瓦在我JS函数定义的一部分。

相反,我加在我的index.html只有一条线路:

<script type="text/javascript" src="libs/cordova/cordova-2.2.0.js"></script>
<script data-main="js/main" src="js/libs/require/require-jquery.js"></script>

一切工作正常! 我可以再次调用cordova.exec()! (测试的iOS 4,iOS 6中,并在iPhone 5)。

说实话,我也不是很明白这一切的工作方式。 我只是假设科尔多瓦需要的一切(如jQuery)之前加载,并且RequireJS是不擅长做这个(或我不知道如何使用它)。

这是可怕的经历这一点。 我很高兴一切都结束了:)

无论如何,我希望这将是有用的人。



Answer 2:

在你require.config对象,你需要通过垫片属性出口科尔多瓦

require.config({
   baseUrl: 'js',
   paths: {
      cordova: '../lib/cordova/cordova-2.2.0'
   },
   shim: {
      cordova: {
         exports: 'cordova'
      }
   }
});

这是最好的定义模块访问科尔多瓦的执行模块

/*global define */

define(['cordova'], function (cordova) {
   'use strict';

   return cordova.require('cordova/exec');
});

创建一个自定义插件现在很容易:

/*global define */

define(['plugins/cordovaExec'], function (cordovaExec) {
   'use strict';

   return function showToast(callback, message) {
      cordovaExec(callback, function (error) {}, "Toaster", "show", [message]);
   };
});

你可以做到这一点只在一个模块中:

/*global define */

define(['cordova'], function (cordova) {
   'use strict';

   var exec = cordova.require('cordova/exec');

   return function showToast(callback, message) {
      exec(callback, function (error) {}, "Toaster", "show", [message]);
   };
});

希望帮助:)



Answer 3:

更新到科尔多瓦-2.4.0,您可以为有人提到自己的博客上发布记录与RequireJS-懒加载它: http://shazronatadobe.wordpress.com/2013/02/08/whats-new-in-科尔多瓦-IOS-2-4-0 /



文章来源: Cordova 2.2.0 on iOS - RequireJS won't load Cordova correctly