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
Vous devez vous connecter pour publier un commentaire.
Désolé de répondre à ma propre question.
C'est ce que je pensais dans mon dernier edit: RequireJS est de jouer avec Cordova 2.2.0!
Avant, j'ai utilisé ce code pour charger cordova:
Avant tout de mon script qui utilisent cordova, j'écrivais:
Dans mon index.html, j'ai eu:
Et ça a bien fonctionné avec cordova 2.0.0! Mais avec cordova 2.2.0, c'est juste un MAUVAIS.
Pour résoudre mon problème:
Je me suis débarrassé de tout sur cordova dans les lignes précédentes.
de mes fonctions js.
Au lieu de cela, j'ai ajouté une ligne dans mon index.html:
Et tout fonctionne bien! Je peux appeler cordova.exec() de nouveau! (Testé sur iOS 4, iOS 6 et de l'iPhone 5).
Pour être honnête, je ne comprends pas très bien comment cela fonctionne. Je viens de supposer que cordova doit être chargé avant tout le reste (comme jquery), et RequireJS n'est pas bon à faire cela (ou je ne sais pas comment l'utiliser).
C'était horrible passer par ce. Je suis content que c'est fini 🙂
De toute façon, j'espère que ce sera utile pour quelqu'un.
Dans votre besoin.config objet, vous devez exporter cordova via le cale attribut:
Il est préférable de définir un module d'accès cordova exec module:
La création d'un plugin personnalisé est maintenant facile:
Vous pourriez le faire dans un module seul:
Espère que cela aide 🙂
Mise à jour à Cordoue-2.4.0 et vous pouvez lazy-load avec RequireJS - comme cela a été mentionné comme une note d'information sur leur blog: http://shazronatadobe.wordpress.com/2013/02/08/whats-new-in-cordova-ios-2-4-0/