Cordova 2.2.0 sur iOS - RequireJS ne chargera pas correctement Cordova

Je suis en train de développer une application web à l'aide de Cordova (Phonegap), de la colonne vertébrale et JQtouch.
Entre autres choses, j'ai besoin d'ajouter des événements à l'utilisateur de calendrier.

Tout fonctionne bien sur Android. Je suis toujours à l'aide de Cordova 2.0.0. (Je n'ai pas la mise à niveau vers la dernière version). Le défilement fonctionne, la navigation est OK, et je peux ajouter des événements dans mon calendrier!

Sur iPhone, c'est différent. Comme je veux que mon application fonctionne sur iOS 6, j'ai eu Cordova 2.2.0 sur mon Mac. Depuis, je ne peux pas ajouter des événements dans le calendrier plus.
Il a travaillé (sur iphone) avec cordova 2.0.0, mais pas maintenant.

Après enquête, j'ai découvert que cordova.exec() n'est pas défini.

J'ai beaucoup cherché sur ce problème mais il semble que personne, sauf moi, rencontré ce problème pour l'instant.

Ici sont des exemples de code qui travaillent avec Cordova 2.0.0, mais pas avec Cordova 2.2.0:

calendar.js un calendrier plug-in pour Cordoue. Je n'ai pas l'écrire. Sur Android, je reçois le message "cordova.exec est définie", alors que sur iOS-je obtenir de l'autre.

//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);

Le code qui appelle la fonction createEvent (elle travaille, que je suis la précédente alerte)

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

Une source possible du problème est peut-être la façon dont j'ai mis à niveau à partir de Cordova 2.0.0 à Cordoue 2.2.0: j'ai juste suivi le tuto "La mise à niveau de Cordova 2.1.0 projets de 2.2.0". Devrais-je l'ai fait "à Partir de la version 2.0.0 de 2.1.0" puis "Formulaire 2.1.0 à la 2.2.0"?

Je vous en serais reconnaissant toute suggestion à ce sujet, que je ne veux vraiment pas à redémarrer mon installation de phonegap.

Sur Mac, je suis en train de travailler avec Mountain Lion 10.8 et xCode 4.5, et je suis en essais de mon appli sur iOS 4 et 6.
Sur PC, je suis en train de travailler avec Aptana studio 3 et Eclipse 3.7.1, et je suis en essais sur Android 2.3.

--- EDIT: Réinstaller Cordova 2.1.0, puis mise à jour de 2.2.0 ---

J'ai juste effacé mon projet, désinstaller Cordova, et tout refaire "from scratch":

  • J'ai installé Cordova 2.1.0 de leur site web.
  • J'ai mis à jour xcode pour 4.5.2 (comme recommandé)
  • J'ai créé un xcode projet dans lequel j'ai copié des parties de mon code.
  • J'ai suivi leur tutoriel à la mise à niveau de Cordova 2.1.0 à Cordoue 2.2.0
  • J'ai mis "Architectures" à "armv7, armv7s" et de "construction Active Seulement l'Architecture" à "Oui"
  • J'ai ajouté les cadres dont j'avais besoin pour le calendrier plug-in: EventKit et EventKitUI

Puis j'ai compilé et lancer mon projet sur mon iPhone 3 (iOS 6), et cordova.exec n'est pas encore défini!

--- EDIT: Déclarer mon calendrier plugin comme un module ---

J'ai ajouté un peu de code pour le calendrier des plug-in directement dans cordova-2.2.0.js (je suis désespérée).

Maintenant dans cordova-2.2.0.js, j'ai les lignes suivantes: (Je les ai fait à partir d'ici)

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;
});

Donc je ne pas utiliser cordova.exec (), mais ceci à la place:

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

Mon calendrier "plug-in" fichier contient simplement la ligne suivante:

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

Et c'est ainsi que je suis avec mon nouveau "module":

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

Et, étonnamment, la fonction exec() est appelée!

Cependant, j'ai eu le message suivant: "ERREUR: Tentative d'appel de cordoue.exec() avant de 'deviceready'. L'ignorant." qui devrait s'affiche lorsque "deviceReady" n'a pas tiré.

Malheureusement, cet événement JAMAIS incendies. Donc mon problème est légèrement différent maintenant, mais il reste encore l'.

--- EDIT: Comparaison avec Android ---

J'ai ajouté quelques lignes à écouter des évènements, à la fois sur Android et iOS:

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

Sur iOS, je reçois le message "load déclenchée", mais pas "PhoneGap est maintenant chargé". Après cela, je ne peux toujours pas utiliser exec().

Sur Android, je n'ai pas de message du tout. Mais je peux utiliser cordova.exec() sans problème.

--- EDIT: Refaire le projet à partir de zéro ---

Au lieu de créer mon projet avec cordova 2.1.0 mise à niveau vers cordova 2.2.0, j'ai essayé de créer un exemple de projet directement avec cordova 2.2.0 puis d'inclure le calendrier plug-in (version originale).

Et il fonctionne parfaitement bien! Avec un peu plus de code pour iOS 6 (qui a besoin d'une autorisation explicite de l'utilisateur), je peux ajouter des événements dans mon calendrier.

Cependant, dès que j'ai ajouter le reste de mon projet (html, css, fichiers js), j'obtiens le même message d'erreur: cordoue.exec n'est pas défini.

Le responsable pourrait être RequireJSqui peut charger cordova-2.2.0.js d'une manière différente. Il a bien travaillé avec cordova 2.0.0 mais ne semble pas avec 2.2.0.

Je vais essayer de voir si je peux charger cordova-2.2.0.js avant de RequireJS, et encore de l'utiliser une fois cordova est chargé.

Je vais vous tenir au courant 🙂

source d'informationauteur Ganesh