10

現在、Cordova (Phonegap)、Backbone、および JQtouch を使用して Web アプリケーションを開発しています。とりわけ、ユーザー カレンダーにイベントを追加する必要があります。

Androidではすべて正常に動作します。私はまだ Cordova 2.0.0 を使用しています。(私は最新バージョンにアップグレードしませんでした)。スクロールは機能し、ナビゲーションは問題なく、カレンダーにイベントを追加できます!

iPhoneでは違います。アプリを iOS 6 で動作させたいので、Mac に Cordova 2.2.0 をインストールしました。それ以来、カレンダーにイベントを追加できなくなりました。cordova 2.0.0 では (iPhone で) 動作しましたが、現在は動作しません。

調べてみると、 cordova.exec() が undefinedであることがわかりました。

私はこの問題についてよく検索しましたが、今のところ私を除いて誰もその問題に遭遇していないようです.

以下は、Cordova 2.0.0 では機能するが、Cordova 2.2.0 では機能しないコードのサンプルです。

Cordova のカレンダー プラグインである calendar.js。私はそれを書きませんでした。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 へのアップグレード方法が考えられます。チュートリアル「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 でアプリをテストしています。PC では、Aptana studio 3 と Eclipse 3.7.1 を使用してテストしています。 Android 2.3 で。

---編集: Cordova 2.1.0 を再インストールしてから 2.2.0 にアップグレード---

プロジェクトを消去し、Cordova をアンインストールして、すべてを「最初から」やり直しました。

  • Cordova 2.1.0 をWeb サイトからインストールしました。
  • xcode を 4.5.2 にアップグレードしました (推奨)
  • コードの一部をコピーした xcode プロジェクトを作成しました。
  • チュートリアルに従って、 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 には次の行があります: (ここから取得しました)

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() が呼び出されます!

ただし、次のメッセージが表示されました。

悲しいことに、このイベントは決して発生しません。したがって、私の問題は今では少し異なりますが、まだ残っています。

---編集: 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() を使用できます。

---編集: プロジェクトを最初からやり直す---

コードバ 2.1.0 でプロジェクトを作成してからコードバ 2.2.0 にアップグレードする代わりに、コードバ 2.2.0 で直接サンプル プロジェクトを作成し、その中にカレンダー プラグイン (オリジナル バージョン) を含めようとしました。

そして、それは完全にうまく機能します!iOS 6 用のコード (ユーザーからの明示的な自動化が必要) をもう少し追加すれば、カレンダーにイベントを追加できます。

ただし、残りのプロジェクト (html、css、js ファイル) を追加するとすぐに、同じエラーが表示されます: cordova.exec is undefined.

責任者はRequireJSである可能性があり、cordova-2.2.0.js を別の方法でロードする可能性があります。cordova 2.0.0 では問題なく動作しましたが、2.2.0 では動作しないようです。

RequireJS の前に cordova-2.2.0.js をロードできるかどうかを確認し、cordova がロードされたら引き続き使用できるかどうかを確認します。

最新情報をお届けします:)

4

3 に答える 3

8

私自身の質問に答えてすみません。

それは私の最後の編集で私が思ったものでした: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>

そしてそれはcordova2.0.0でうまく機能しました!しかし、cordova 2.2.0では、これは間違いです。

私の問題を解決するには:

私は前の行でcordovaに関するすべてを取り除きました。

  • require.configにこれ以上のcordovaはありません。
  • js関数のdefine部分にcordovaはもうありません。

代わりに、index.htmlに1行だけ追加しました。

<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でテスト済み)

正直なところ、これらすべてがどのように機能するのかよくわかりません。私は、cordovaを他のすべて(jqueryなど)の前にロードする必要があると思いますが、RequireJSはこれを行うのが得意ではありません(または使用方法がわかりません)。

これを通過するのはひどいものでした。終わってよかったです:)

とにかく、これが誰かに役立つことを願っています。

于 2012-11-07T11:19:19.080 に答える
8

require.configオブジェクトで、 shim属性を介してcordovaをエクスポートする必要があります。

require.config({
   baseUrl: 'js',
   paths: {
      cordova: '../lib/cordova/cordova-2.2.0'
   },
   shim: {
      cordova: {
         exports: 'cordova'
      }
   }
});

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

1 つのモジュールでのみ実行できます。

/*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]);
   };
});

それが役立つことを願っています:)

于 2012-12-19T15:44:08.823 に答える
2

Cordova- 2.4.0にアップデートすると、ブログのリリース ノートに記載されているように、RequireJS を使用して遅延ロードできます。コルドバ-ios-2-4-0/

于 2013-02-17T20:03:29.903 に答える