当前位置 : 主页 > 手机开发 > cordova >

Cordova 2.2.0在iOS上 – RequireJS将无法正确加载Cordova

来源:互联网 收集:自由互联 发布时间:2021-06-10
我正在使用Cordova(Phonegap),Backbone和JQtouch开发一个webapp. 除此之外,我需要在用户日历中添加事件. Android上的一切都很好.我还在使用Cordova 2.0.0. (我没有升级到最新版本).滚动作品,导航可以
我正在使用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的方式:我刚刚遵循教程“Upgrading Cordova 2.1.0 projects to 2.2.0”.我应该做“从2.0.0到2.1.0”,然后“Form 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上进行测试.

—编辑:重新安装Cordova 2.1.0然后升级到2.2.0 —

我刚刚删除了我的项目,卸载Cordova,并从头开始重做一切:

>我从their website安装了Cordova 2.1.0.
>我将xcode升级到4.5.2(推荐)
>我创建了一个xcode项目,其中我复制了我的代码部分.
>我跟着their tutorial从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中,我有以下几行:(I got them from here)

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,它仍然会使用它.

我会保持你最新的:)

对不起,回答我自己的问题.

这是我上次编辑的想法: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,这只是错误.

解决我的问题:

我已经摆脱了以前的一切关于科尔多瓦的一切.

>在require.config中没有更多的cordova.
>在定义部分不再有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)之前,cordova需要加载,而RequireJS不太好(或者我不知道如何使用它).

这是可怕的.我很高兴结束了:)

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

网友评论