現在、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 がロードされたら引き続き使用できるかどうかを確認します。
最新情報をお届けします:)