iOS 上的 Cordova 2.2.0 - RequireJS 无法正确加载 Cordova



我目前正在使用Cordova(PhoneGap),Backbone和JQTouch开发WebApp。除其他外,我需要在用户日历中添加事件。

在Android上一切正常。我仍在使用Cordova 2.0.0。(我没有升级到最新版本)。滚动作品,导航还可以,我可以在日历中添加事件!

在iPhone上,情况有所不同。当我希望我的应用程序在iOS 6上工作时,我在Mac上获得了Cordova 2.2.0。从那时起,我再也无法在日历中添加事件。它使用Cordova 2.0.0使用(在iPhone上),但现在不使用。

调查后,我发现 cordova.exec()是未定义的

我对这个问题进行了很多搜索,但是除了我以外,似乎没人遇到这个问题。

这是与Cordova 2.0.0合作但与Cordova 2.2.0合作的代码样本:

calendar.js,Cordova的日历插件。我没有写。在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 %>'); 
}

这个问题的可能来源可能是我从Cordova 2.0.0升级到Cordova 2.2.0的方式:我刚刚遵循"升级Cordova 2.1.0项目为2.2.0"教程。我应该完成" 2.0.0到2.1.0",然后"表格2.1.0至2.2.0"?

我会感谢任何建议,因为我真的不想重新启动我的Phonegap安装。

在Mac上,我正在使用Mountain Lion 10.8和Xcode 4.5工作,并且我正在iOS 4和6上测试我的应用程序。在PC上,我正在与Aptana Studio 3和Eclipse 3.7.1合作,并且正在测试Android 2.3。

---- 编辑:Relestall Cordova 2.1.0,然后升级到2.2.0 ----

我只是删除了我的项目,卸载科尔多瓦,然后重做所有"从头开始"的一切:

  • 我从他们的网站安装了Cordova 2.1.0。
  • 我将Xcode升级到4.5.2(建议)
  • 我创建了一个Xcode项目,其中我复制了代码的部分。
  • 我遵循他们的教程,从Cordova 2.1.0升级到Cordova 2.2.0
  • 我将"架构"设置为" ARMV7,ARMV7S"one_answers"仅构建活跃的架构"到"是"
  • 我添加了日历插件所需的框架:EventKit和EventKitui

然后,我在iPhone 3(带有iOS 6)上编译并启动我的项目,而 Cordova.exec仍然未定义

--- 编辑:将我的日历插件声明为模块 ---

我直接在Cordova-2.2.0.js中为日历插件添加了一些代码(我很拼命)。

现在在Cordova-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()称为!

但是,我收到了以下消息:" 错误:尝试在'deviceready'之前调用Cordova.exec()。忽略。"当" deviceready"尚未触发时,应该出现。

可悲的是,此事件从不开火。所以我的问题现在略有不同,但仍然存在。

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

我在Android和iOS中添加了几行以收听事件:

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

在iOS上,我收到消息"触发负载",但不是"电话盖"现在已加载"。之后,我仍然无法使用exec()。

在Android上,我根本没有收到任何消息。但是我可以使用Cordova.exec()没有任何问题。

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

我不用使用Cordova 2.1.0创建我的项目,然后升级到Cordova 2.2.0,而是尝试直接使用Cordova 2.2.0创建一个示例项目,然后在其中包含日历插件(原始版本)。p>,它的工作原理很好!iOS 6的更多代码(需要用户的明确自动化),我可以在日历中添加事件。

但是,一旦我添加项目的其余部分(html,css,js文件),我会遇到相同的错误:cordova.exec不确定。

负责是 requirejs ,它可以以不同的方式加载Cordova-2.2.0.js。它与Cordova 2.0.0合作均匀,但似乎与2.2.0相同。

我会尝试查看是否可以在requirjs之前加载Cordova-2.2.0.js,并在加载Cordova后仍然使用它。

我会让您保持最新状态:)

很抱歉回答我自己的问题。

这是我在上一个编辑中的想法: requirejs与Cordova 2.2.0

混乱

之前,我使用此代码加载Cordova:

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

在使用Cordova的任何脚本之前,我都在写:

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

在我的index.html中,我有:

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

它与Cordova 2.0.0效果很好!但是使用Cordova 2.2.0,这完全是错误的

解决我的问题:

我摆脱了前几行中有关科尔多瓦的一切。

  • 不再需要Cordova。
  • 在定义部分中不再有科尔多瓦我的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不擅长这样做(或者我不知道如何使用)。

>

经历这真是太糟糕了。我很高兴结束了:)

无论如何,我希望这对某人很有用。

导出 Cordova 通过 shim 属性:

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

最好定义一个模块以访问 Cordova的Exec Module

/*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]);
   };
});

希望有帮助:)

更新到cordova-2.4.0,您可以用requirejs- lazy-load-load-nequ-nition-temer-new-hef-tate-he在他们的博客上注释:http://shazronatadobe.wordpress.com/2013/02/08/whats-new-inew-inew-inwin-cordova-ios-2-4-0/

最新更新