我目前正在使用 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() 是 undefined。
我对这个问题进行了很多搜索,但除了我之外,似乎没有人现在遇到过这个问题。
以下是适用于 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,我正在测试在安卓 2.3 上。
---编辑:重新安装 Cordova 2.1.0 然后升级到 2.2.0 ---
我刚刚删除了我的项目,卸载了 Cordova,然后“从头开始”重做所有事情:
- 我从他们的网站安装了 Cordova 2.1.0 。
- 我将 xcode 升级到 4.5.2(推荐)
- 我创建了一个 xcode 项目,在其中复制了部分代码。
- 我按照他们的教程从 Cordova 2.1.0 升级到 Cordova 2.2.0
- 我将“架构”设置为“armv7,armv7s”,将“仅构建活动架构”设置为“是”
- 我添加了日历插件所需的框架: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 上,我收到消息“加载已触发”,但没有收到“PhoneGap 已加载”。之后,我仍然无法使用 exec()。
在 Android 上,我根本没有收到任何消息。但我可以毫无问题地使用cordova.exec()。
---编辑:从头开始重做项目---
我没有使用cordova 2.1.0 创建我的项目然后升级到cordova 2.2.0,而是尝试直接使用cordova 2.2.0 创建一个示例项目,然后在其中包含日历插件(原始版本)。
它工作得很好!使用 iOS 6 的更多代码(需要用户明确授权),我可以在我的日历中添加事件。
但是,一旦我添加了我的项目的其余部分(html、css、js 文件),我就会收到同样的错误:cordova.exec 未定义。
负责可能是RequireJS,它可能以不同的方式加载cordova-2.2.0.js。它适用于cordova 2.0.0,但似乎不适用于2.2.0。
我会尝试看看是否可以在 RequireJS 之前加载cordova-2.2.0.js,并且在加载cordova 后仍然使用它。
我会及时通知你:)