Cordova 2.2.0 на iOS-RequireJS не будет правильно загружать Cordova
в настоящее время я разрабатываю веб-приложение с использованием Cordova (Phonegap), Backbone и JQtouch. Помимо прочего, мне нужно добавить события в пользовательский календарь.
все отлично работает на Android. Я все еще использую Cordova 2.0.0. (Я не обновился до последней версии). Прокрутка работает, навигация в порядке, и я могу добавлять события в свой календарь!
на iPhone все по-другому. Поскольку я хочу, чтобы мое приложение работало на iOS 6, я получил Cordova 2.2.0 на своем Mac. С тех пор я не могу добавлять события в календаре больше нет. Он работал (на iphone) с cordova 2.0.0, но не сейчас.
после расследования я узнал, что Кордова.метод exec() неопределено.
Я много искал об этой проблеме, но, похоже, никто, кроме меня, не встретил эту проблему на данный момент.
вот примеры кода, которые работают с Cordova 2.0.0, но не с Cordova 2.2.0:
календарь.js, плагин календаря для Cordova. Я его не писал. На Android я получаю сообщение "Кордова.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. На ПК я работаю с Aptana studio 3 и Eclipse 3.7.1, и я тестирую на Android 2.3.
- - -EDIT: переустановите 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" и "строить только активную архитектуру" в "Да"
- I добавлены фреймворки, необходимые для плагина календаря: EventKit и EventKitUI
затем я скомпилировал и запустил свой проект на своем iPhone 3 (с iOS 6) и Кордова.exec по-прежнему не определен!
- - -EDIT: объявите мой плагин календаря как модуль - - -
я добавил код для плагина календаря непосредственно в cordova-2.2.0.js (я в отчаянии).
теперь в Кордове-2.2.0.Яш, у меня есть следующие строки: (я получил их отсюда)
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;
});
поэтому я не использую Кордову.метод 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 ()!
однако я получил следующее сообщение:"ошибка: попытка вызова cordova.метод exec() до функция deviceready сработала'. Игнорирующий. "который должен появиться, когда "deviceReady" не выстрелил.
к сожалению, это событие никогда пожары. Так что моя проблема сейчас немного другая, но все еще остается.
- - - EDIT: сравнение с Android - - -
я добавил несколько строк для прослушивания событий, как в Android и iOS:
window.addEventListener('load', function () {
alert("load triggered");
document.addEventListener('deviceready', function () {
alert("PhoneGap is now loaded!");
}, false);
}, false);
на iOS я получаю сообщение "load triggered", но не "PhoneGap теперь загружен". После этого, я все еще не могу использовать выполнение.)(
на Android я вообще не получаю сообщений. Но я могу использовать Кордову.exec () без проблем.
- - -EDIT: повторить проект с нуля - - -
вместо создания моего проекта с 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.
Я попробую посмотреть, могу ли я загрузить cordova-2.2.0.js перед RequireJS, и все еще используйте его после загрузки cordova.
Я буду держать вас в курсе :)
3 ответов
извините, чтобы ответить на мой собственный вопрос.
Это было то, что я думал в моем последнем редактировании:RequireJS возится с Cordova 2.2.0!
раньше я использовал этот код для загрузки cordova:
require.config({
paths: {
cordova: 'libs/cordova/cordova-2.2.0', ...
перед любым из моих сценариев, которые используют cordova, я писал:
define([
'jquery',
'cordova',
...
], function($) { ... }
в моем индексе.html, у меня было:
<script data-main="js/main" src="js/libs/require/require-jquery.js"></script>
и он хорошо работал с cordova 2.0.0! Но!--9-->С cordova 2.2.0, это просто Неправильно!--10-->.
, чтобы решить мою проблему:
Я избавился от всего о Кордове в предыдущих строках.
- больше не требуется Кордова.конфиг.
- нет больше Кордовы в части определения моих функций js.
вместо этого я добавил только одну строку в свой индекс.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>
и все работает отлично! Я могу позвонить Кордове.метод exec() снова! (протестировано на iOS 4, iOS 6 и iPhone 5).
честно говоря, я не очень хорошо понимаю, как все это работает. Я просто предполагаю, что Кордова должна быть загружена перед всем остальным (например, jquery), и RequireJS не очень хорошо это делает (или я не знаю, как его использовать).
было ужасно проходить через это. Я рад, что все закончилось:)
в любом случае, я надеюсь, это будет полезно для кого-то.
в своем требуют.config объект, вам нужно экспортировать Кордова через сим:
require.config({
baseUrl: 'js',
paths: {
cordova: '../lib/cordova/cordova-2.2.0'
},
shim: {
cordova: {
exports: 'cordova'
}
}
});
лучше всего определить модуль для доступа модуль exec Кордовы:
/*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 - как упоминалось в примечании к выпуску в своем блоге: http://shazronatadobe.wordpress.com/2013/02/08/whats-new-in-cordova-ios-2-4-0/