다음은 가장 최근의 PhoneGap / Cordova (2.1.0)에서 저에게 적합합니다.
작동 원리 :
- 개념이 매우 간단합니다.
- 위의 시간 초과 솔루션 중 일부의 논리를 뒤집 었습니다.
- device_ready 이벤트 등록 ( PhoneGap 문서에서 권장 )
- 시간 초과 후에도 이벤트가 여전히 발생하지 않으면 브라우저 가정으로 대체합니다.
- 반대로, 위의 다른 솔루션은 일부 PhoneGap 기능 또는 기타 기능을 테스트하고 테스트 중단을 관찰하는 데 의존합니다.
장점 :
- PhoneGap 권장 device_ready 이벤트를 사용합니다.
- 모바일 앱은 지연이 없습니다. device_ready 이벤트가 발생하자마자 진행합니다.
- 사용자 에이전트 스니핑 없음 (나는 내 앱을 모바일 웹 사이트로 테스트하는 것을 좋아하므로 브라우저 스니핑은 옵션이 아니 었습니다).
- 문서화되지 않은 (따라서 깨지기 쉬운) PhoneGap 기능 / 속성에 의존하지 않습니다.
- 데스크톱 또는 모바일 브라우저를 사용하는 경우에도 코드베이스에 cordova.js를 유지하십시오. 따라서 이것은 OP의 질문에 답합니다.
- Wytze는 위에서 다음과 같이 말했습니다. '나는 Cordova가 "지원되는 장치를 찾고 포기했습니다"라는 매개 변수를 어딘가에 설정하고 싶지만 그러한 매개 변수가없는 것 같습니다. " 그래서 여기에 하나를 제공합니다.
단점 :
- 시간 초과가 엉망입니다. 그러나 우리의 모바일 앱 로직은 지연에 의존하지 않습니다. 오히려 웹 브라우저 모드 일 때 대체 수단으로 사용됩니다.
==
완전히 새로운 빈 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"));
}