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/