以下は、最新のPhoneGap / Cordova(2.1.0)で動作します。
使い方:
- コンセプトは非常にシンプル
- 上記のタイムアウトソリューションの一部のロジックを逆にしました。
- device_readyイベントに登録します(PhoneGapのドキュメントで推奨されています)。
- タイムアウト後もイベントがまだ発生しない場合は、ブラウザーの想定にフォールバックします。
- 対照的に、上記の他のソリューションは、PhoneGap機能などをテストし、テストの中断を監視することに依存しています。
利点:
- PhoneGap推奨のdevice_readyイベントを使用します。
- モバイルアプリに遅延はありません。device_readyイベントが発生するとすぐに処理を進めます。
- ユーザーエージェントのスニッフィングはありません(私のアプリをモバイルWebサイトとしてテストするのが好きなので、ブラウザーのスニッフィングは選択肢にありませんでした)。
- 文書化されていない(したがって、もろい)PhoneGap機能/プロパティに依存しない。
- デスクトップまたはモバイルブラウザーを使用している場合でも、cordova.jsをコードベースに保持します。したがって、これはOPの質問に答えます。
- Wytzeは上記のように述べています。「コルドバがどこかでパラメータを設定して、「サポートされているデバイスを見つけてあきらめた」と言ってほしいのですが、そのようなパラメータはないようです。」ここに1つ提供します。
短所:
- タイムアウトは厄介です。しかし、モバイルアプリのロジックは遅延に依存していません。むしろ、それはウェブブラウザモードにいるときのフォールバックとして使用されます。
==
新しい空のPhoneGapプロジェクトを作成します。提供されているサンプルのindex.jsで、下部にある「app」変数を次のように置き換えます。
var app = {
// denotes whether we are within a mobile device (otherwise we're in a browser)
iAmPhoneGap: false,
// how long should we wait for PhoneGap to say the device is ready.
howPatientAreWe: 10000,
// id of the 'too_impatient' timeout
timeoutID: null,
// id of the 'impatience_remaining' interval reporting.
impatienceProgressIntervalID: null,
// Application Constructor
initialize: function() {
this.bindEvents();
},
// Bind Event Listeners
//
// Bind any events that are required on startup. Common events are:
// `load`, `deviceready`, `offline`, and `online`.
bindEvents: function() {
document.addEventListener('deviceready', this.onDeviceReady, false);
// after 10 seconds, if we still think we're NOT phonegap, give up.
app.timeoutID = window.setTimeout(function(appReference) {
if (!app.iAmPhoneGap) // jeepers, this has taken too long.
// manually trigger (fudge) the receivedEvent() method.
appReference.receivedEvent('too_impatient');
}, howPatientAreWe, this);
// keep us updated on the console about how much longer to wait.
app.impatienceProgressIntervalID = window.setInterval(function areWeThereYet() {
if (typeof areWeThereYet.howLongLeft == "undefined") {
areWeThereYet.howLongLeft = app.howPatientAreWe; // create a static variable
}
areWeThereYet.howLongLeft -= 1000; // not so much longer to wait.
console.log("areWeThereYet: Will give PhoneGap another " + areWeThereYet.howLongLeft + "ms");
}, 1000);
},
// deviceready Event Handler
//
// The scope of `this` is the event. In order to call the `receivedEvent`
// function, we must explicity call `app.receivedEvent(...);`
onDeviceReady: function() {
app.iAmPhoneGap = true; // We have a device.
app.receivedEvent('deviceready');
// clear the 'too_impatient' timeout .
window.clearTimeout(app.timeoutID);
},
// Update DOM on a Received Event
receivedEvent: function(id) {
// clear the "areWeThereYet" reporting.
window.clearInterval(app.impatienceProgressIntervalID);
console.log('Received Event: ' + id);
myCustomJS(app.iAmPhoneGap); // run my application.
}
};
app.initialize();
function myCustomJS(trueIfIAmPhoneGap) {
// put your custom javascript here.
alert("I am "+ (trueIfIAmPhoneGap?"PhoneGap":"a Browser"));
}