PhoneGap: обнаружение при запуске на рабочем столе браузера

Я разрабатываю веб-приложение, которое использует PhoneGap: создавайте для мобильной версии и хотите иметь одну кодовую базу для "настольных" и мобильных версий. Я хочу узнать, будут ли работать вызовы PhoneGap (т.е. Пользователь на мобильном устройстве, поддерживающем PhoneGap).

Я искал и не могу поверить, что нет простого способа сделать это. Многие люди предлагали предложения;

Ни одна из них не работает, если вы не удалите файл Javascript PhoneGap из настольной версии приложения, что наносит ущерб моей цели иметь одну кодовую базу.

Пока единственным решением, которое я придумал, является обнюхивание браузером/пользователем, но это, по меньшей мере, не является надежным. Любые лучшие решения приветствуются!

РЕДАКТИРОВАТЬ: Немногим лучшим решением является попытка вызова функции PhoneGap после небольшого таймаута - если это не сработает, тогда предположите, что пользователь находится в веб-браузере на рабочем столе.

Ответ 1

Я использую этот код:

if (navigator.userAgent.match(/(iPhone|iPod|iPad|Android|BlackBerry|IEMobile)/)) {
  document.addEventListener("deviceready", onDeviceReady, false);
} else {
  onDeviceReady(); //this is the browser
}

ОБНОВЛЕНИЕ

Есть много других способов определить, работает ли телефонная книга в браузере или нет, вот еще один отличный вариант:

var app = document.URL.indexOf( 'http://' ) === -1 && document.URL.indexOf( 'https://' ) === -1;
if ( app ) {
    // PhoneGap application
} else {
    // Web page
}  

как показано здесь: Обнаружение между мобильным браузером или приложением PhoneGap

Ответ 2

Я написал сообщение об этом несколько дней назад. Это лучшее решение, которое вы можете найти (до тех пор, пока PhoneGap не выпустит что-то, может быть, а может и нет), он короткий, простой и совершенный (я проверил его всеми возможными способами и платформой).

Эта функция выполнит задание для 98% случаев.

/**
 * Determine whether the file loaded from PhoneGap or not
 */
function isPhoneGap() {
    return (window.cordova || window.PhoneGap || window.phonegap) 
    && /^file:\/{3}[^\/]/i.test(window.location.href) 
    && /ios|iphone|ipod|ipad|android/i.test(navigator.userAgent);
}

if ( isPhoneGap() ) {
    alert("Running on PhoneGap!");
} else {
    alert("Not running on PhoneGap!");
}

Чтобы выполнить другие 2% случаев, выполните следующие действия (это связано с небольшим изменением собственного кода):

Создайте файл с именем __ phonegap_index.html, с источником:

<!-- __phonegap_index.html -->
<script type="text/javascript">
    function isPhoneGap() {
        //the function content is as described above
    }

    //ensure the 98% that this file is called from PhoneGap.
    //in case somebody accessed this file directly from the browser.
    if ( isPhoneGap() )
        localStorage.setItem("isPhoneGap","1");

    //and redirect to the main site file.
    window.location = "index.html";
</script>

Теперь на native просто измените стартовую страницу с index.html на __ phonegap_index.html на всех ваших платформах PhoneGap. Скажем, имя моего проекта пример, файлы, которые вам нужно изменить (например, для PhoneGap версии 2.2.0):

  • iOS - CordovaLibApp/AppDelegate.m
  • Android - src/org/apache/cordova/example/cordovaExample.java
  • Windows 8 - example/package.appxmanifest
  • BlackBerry - www/config.xml
  • WebOS - framework/appinfo.json
  • Bada - src/WebForm.cpp (строка 56)
  • Window Phone 7 - Не знаю, где (кто-то еще развивается на этой платформе?!)

Наконец, вы можете использовать его в любом месте вашего сайта, если он работает в PhoneGap или нет:

if ( localStorage.getItem("isPhoneGap") ) {
    alert("Running on PhoneGap!");
} else {
    alert("Not running on PhoneGap!");
}

Надеюсь, это поможет.: -)

Ответ 3

Я знаю, что это было дано некоторое время назад, но "PhoneGap.available" больше не существует. Вы должны использовать:

if (window.PhoneGap) {
  //do stuff
}

или начиная с версии 1.7, предпочитайте:

if (window.cordova) {
  //do stuff
}

ОБНОВЛЕНИЕ 2019: как сказано в комментариях, это работает только в том случае, если вы не включили cordova lib в сборку браузера на рабочем столе. И, конечно же, рекомендуется включать только жесткие минимальные файлы javascript/html/css для каждого целевого устройства.

Ответ 4

Самый надежный способ, с помощью которого мы обнаружили, что мы находимся в приложении cordova/phonegap, - это изменить пользовательский агент приложения cordova, используя эту конфигурацию AppendUserAgent.

В config.xml добавить:

<preference name="AppendUserAgent" value="Cordova" />

Затем вызовите:

var isCordova = navigator.userAgent.match(/Cordova/i))

Почему?

  • window.cordova и document.addEventListener('deviceready', function(){}); находятся в состоянии гоночных условий.
  • navigator.standalone не работает, когда <content src="index.html" /> является веб-сайтом (например: <content src="https://www.example.com/index.html" /> или cordova-plugin-remote-injection)
  • Попытка пользовательских агентов с белыми списками догадываться, действительно ли это настоящий браузер, очень сложна. Android-браузеры часто являются обычными веб-просмотрами.

Ответ 5

Я думаю, что это проще всего: var isPhoneGap = (location.protocol == "file:")

ИЗМЕНИТЬ Для некоторых людей это не сработало. Тогда вы можете попробовать (не протестировали)

var isPhoneGap = ! /^http/.test(location.protocol);

Ответ 6

Это работает для меня (работает 1.7.0)

if (window.device) {
  // Running on PhoneGap
}

Протестировано на настольных компьютерах Chrome и Safari.

Ответ 7

Как и исходный плакат, я использую службу сборки phonegap. После двух дней и почти 50 тестов, я придумал элегантное решение, которое отлично работает для меня.

Я не мог использовать UA sniffing, потому что я хотел протестировать и запустить в мобильных браузерах. Я изначально поселился на коббербой довольно функциональной техники. Это не сработало для меня, потому что задержка/тайм-аут "howPatientAreWe: 10000" была слишком сложной для разработки в браузере. И установка его ниже будет иногда выходить из строя в режиме приложения/устройства. Должен быть другой способ...

Служба создания телефонной карты требует, чтобы файл phonegap.js был исключен из вашего репозитория кода, прежде чем отправлять файлы приложения в службу. Поэтому я могу проверить его существование, чтобы определить, работает ли он в браузере и приложении.

Еще одно предостережение, я также использую jQueryMobile, поэтому оба jQM и телефонные звонки должны были инициализироваться, прежде чем я смог начать любые пользовательские сценарии. Следующий код помещается в начале моего пользовательского файла index.js для приложения (после jQuery, перед jQM). Кроме того, в документации на телефонную заставку говорится, что <script src="phonegap.js"></script> размещается где-то в HTML. Я оставляю это полностью загрузить и загрузить его с помощью $.getScript() для тестирования объекта.

isPhoneGap = false;
isPhoneGapReady = false;
isjQMReady = false;

$.getScript("phonegap.js")
.done(function () {
    isPhoneGap = true;
    document.addEventListener("deviceready", function () {
        console.log("phonegap ready - device/app mode");
        isPhoneGapReady = true;
        Application.checkReadyState();
    }, false);
})
.fail(function () {
    console.log("phonegap load failed - browser only");
    isPhoneGapReady = true;
    Application.checkReadyState();
});

$(document).bind("mobileinit", function () {
    Application.mobileInit();
    $(document).one("pageinit", "#Your_First_jQM_Page", function () {
        isjQMReady = true;
        Application.checkReadyState();
    });
});

Application = {
    checkReadyState: function () {
        if (isjQMReady && isPhoneGapReady) {
            Application.ready();
        }
    },
    mobileInit: function () {
        // jQM initialization settings go here
        // i.e. $.mobile.defaultPageTransition = 'slide';
    },
    ready: function () {
        // Both phonegap (if available) and jQM are fired up and ready
        // let the custom scripting begin!
    }
}

Ответ 8

Интересно, что многие ответы, но они не включают эти три варианта:

1 - Cordova.js установит объект cordova в глобальном масштабе. Если он есть, то вы, скорее всего, работаете в области Кордовы.

var isCordovaApp = !!window.cordova;

2 - Кордова запустит ваше приложение, так как вы откроете документ HTML со своего рабочего стола. Вместо протокола HTTP он будет использовать FILE. Обнаружение этого даст вам возможность предположить, что ваше приложение было загружено локально.

var isCordovaApp = document.URL.indexOf('http://') === -1
  && document.URL.indexOf('https://') === -1;

3 - Используйте событие загрузки кордовы script для обнаружения контекста. script include может быть легко удален в процессе сборки или загрузка script просто провалится в браузере. Так что эта глобальная переменная не будет установлена.

<script src="../cordova.js" onload="javascript:window.isCordovaApp = true;"></script>

Кредит отправляется Damien Antipa из Adobe

Ответ 9

Я использую этот метод:

debug = (window.cordova === undefined);

debug будет true в среде браузера, false на устройстве.

Ответ 10

Это кажется жизнеспособным, и я использовал его в производстве:

if (document.location.protocol == "file:") {
    // file protocol indicates phonegap
    document.addEventListener("deviceready", function() { $(initInternal);} , false);
}
else {
    // no phonegap, start initialisation immediately
    $(initInternal);
}

Источник: http://tqcblog.com/2012/05/09/detecting-phonegap-cordova-on-startup/

Ответ 11

Суть проблемы в том, что до тех пор, пока cordova.device undefined, ваш код не может быть уверен, что из-за того, что cordova установила, что ваше устройство не поддерживается, или если это потому, что кордова все еще готовится сама и deviceready будет срабатывать позже (или третий вариант: кордова не загрузилась должным образом).

Единственное решение - определить период ожидания и решить, что после этого периода ваш код должен предположить, что устройство не поддерживается. Я хочу, чтобы кордова установила параметр где-нибудь, чтобы сказать: "Мы пробовали найти поддерживаемое устройство и сдались", но похоже, что такого параметра нет.

Как только это будет установлено, вы можете сделать что-то конкретное в тех ситуациях, когда нет поддерживаемого устройства. Как и укрытие ссылок на рынок приложений на устройстве, в моем случае.

Я собрал эту функцию, которая должна охватывать практически любую ситуацию. Он позволяет определить обработчик deviceready, обработчик, никогда не готовый к устройству, и время ожидания.

//Deals with the possibility that the code will run on a non-phoneGap supported
//device such as desktop browsers. Gives several options including waiting a while
//for cordova to load after all.
//In:
//onceReady (function) - performed as soon as deviceready fires
//patience 
//  (int) - time to wait before establishing that cordova will never load
//  (boolean false) - don't wait: assume that deviceready will never fire
//neverReady 
//  (function) - performed once it established deviceready will never fire
//  (boolean true) - if deviceready will never fire, run onceReady anyhow
//  (boolean false or undefined) - if deviceready will never fire, do nothing
function deviceReadyOrNot(onceReady,patience,neverReady){

    if (!window.cordova){
            console.log('Cordova was not loaded when it should have been')
            if (typeof neverReady == "function"){neverReady();}
        //If phoneGap script loaded...
        } else {
            //And device is ready by now...
            if  (cordova.device){
                callback();
            //...or it loaded but device is not ready
            } else {
                //...we might run the callback after
                if (typeof patience == "number"){
                    //Run the callback as soon as deviceready fires
                    document.addEventListener('deviceready.patience',function(){
                        if (typeof onceReady == "function"){onceReady();}
                    })
                    //Set a timeout to disable the listener
                    window.setTimeout(function(){
                        //If patience has run out, unbind the handler
                        $(document).unbind('deviceready.patience');
                        //If desired, manually run the callback right now
                        if (typeof neverReady == 'function'){neverReady();}
                    },patience);
                //...or we might just do nothing
                } else {
                    //Don't bind a deviceready handler: assume it will never happen
                    if (typeof neverReady == 'function'){neverReady();} 
                    else if (neverReady === true){onceReady();} 
                    else {
                       //Do nothing
                    }
                }
            }
    }

}

Ответ 12

Как я это делаю, используется глобальная переменная, которая перезаписывается только версией cordova.js для браузера. В основном файле html (обычно index.html) у меня есть следующие скрипты, зависящие от порядка:

    <script>
        var __cordovaRunningOnBrowser__ = false
    </script>
    <script src="cordova.js"></script> <!-- must be included after __cordovaRunningOnBrowser__ is initialized -->
    <script src="index.js"></script> <!-- must be included after cordova.js so that __cordovaRunningOnBrowser__ is set correctly -->

И внутри cordova.js я просто:

__cordovaRunningOnBrowser__ = true

При создании мобильного устройства, cordova.js не будет использоваться (и вместо этого будет использоваться файл кордоны, специфичный для платформы), поэтому этот метод имеет право быть на 100% правильным независимо от протоколов, userAgents, или переменные библиотеки (которые могут измениться). Могут быть другие вещи, которые я должен включить в cordova.js, но я не знаю, что они еще.

Ответ 13

Другой способ, основанный на решении SlavikMe:

Просто используйте параметр запроса, переданный в index.html из вашего источника PhoneGap. Т.е. в Android вместо

super.loadUrl("file:///android_asset/www/index.html");

использовать

super.loadUrl("file:///android_asset/www/index.html?phonegap=1");

У SlavikMe есть отличный список, где это сделать на других платформах.

Тогда ваш index.html может просто сделать это:

if (window.location.href.match(/phonegap=1/)) {
  alert("phonegap");
}
else {
  alert("not phonegap");
}

Ответ 14

Чтобы сохранить одну кодовую базу, какой интерес представляет "платформа", на которой работает код. Для меня эта "платформа" может быть трех разных вещей:

  • 0: компьютерный браузер
  • 1: мобильный браузер
  • 2: phonegap/cordova

Способ проверки платформы:

var platform;
try {
 cordova.exec(function (param) {
   platform = 2;
  }, function (err) {}, "Echo", "echo", ["test"]);
} catch (e) {
  platform = 'ontouchstart' in document.documentElement ? 1 : 0;
}

Примечание:

  • Это должно быть запускать только после того, как загружена кордова .js (body onload (...), $(document).ready(...))

  • "ontouchstart" в документе document.documentElement будет присутствовать в ноутбуках и настольных мониторах с сенсорным экраном, чтобы он сообщал о мобильном браузере, даже если это рабочий стол. Существуют различные способы сделать более точную проверку, но я использую ее, потому что она по-прежнему заботится о 99% случаев, в которых я нуждаюсь. Вы всегда можете подставить эту строку для чего-то более надежного.

Ответ 15

Аароны, попробуйте

if (PhoneGap.available){
    do PhoneGap stuff;
}

Ответ 16

Решение GeorgeW в порядке, но даже на реальном устройстве PhoneGap.available верен только после загрузки вещей PhoneGap, например. onDeviceReady в документе .addEventListener('deviceready', onDeviceReady, false).

До этого времени, если вы хотите узнать, вы можете сделать следующее:

runningInPcBrowser =
    navigator.userAgent.indexOf('Chrome')  >= 0 ||
    navigator.userAgent.indexOf('Firefox') >= 0

Это решение предполагает, что большинство разработчиков разрабатывают Chrome или Firefox.

Ответ 17

У меня такая же проблема.

Я склоняюсь к добавлению # cordova = true к URL-адресу, загруженному клиентом cordova, и тестированию для location.hash.indexOf( "cordova = true" ) > -1 на моей веб-странице.

Ответ 18

Следующее работает для меня с самой последней PhoneGap/Cordova (2.1.0).

Как это работает:

  • Очень простая концепция
  • Я перевернул логику некоторых из вышеперечисленных решений тайм-аута.
  • Зарегистрируйтесь для события device_ready (рекомендованного в документах PhoneGap)
    • Если событие по-прежнему не срабатывает после таймаута, откидывается на предположение о браузере.
    • В отличие от других решений выше полагаются на тестирование некоторых функций PhoneGap или других и просмотр их тестового пробоя.

Преимущества:

  • Использует событие device_ready, рекомендованное PhoneGap.
  • У мобильного приложения нет задержек. Как только произойдет событие device_ready, мы продолжим.
  • Нет, пользовательский нюхает (мне нравится тестировать мое приложение в качестве мобильного сайта, так что браузерное нюхание не было для меня вариантом).
  • Никакая зависимость от недокументированных (и, следовательно, хрупких) функций/свойств PhoneGap.
  • Храните свою кордову .js в своей кодовой базе даже при использовании настольного или мобильного браузера. Таким образом, это отвечает на вопрос ОП.
  • Wytze сказал выше: "Я хочу, чтобы кордова установила параметр где-нибудь, чтобы сказать" Мы пытались найти поддерживаемое устройство и сдались ", но похоже, что такого параметра нет". Поэтому я предоставляю его здесь.

Недостатки:

  • Тайм-ауты icky. Но наша логика мобильного приложения не полагается на задержку; скорее, он используется как резерв, когда мы находимся в режиме веб-браузера.

==

Создайте новый пустой проект 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"));
}

Ответ 19

Я наткнулся на эту проблему несколько месяцев назад, когда начал наше приложение, потому что мы хотели, чтобы приложение также было "browser-compatible" (при том понимании, что в этом сценарии будет заблокирована некоторая функциональность: запись звука, компас, и т.д.).

Единственное 100% (и я настаиваю на 100-процентном условии) решение PRE-определить контекст выполнения приложения:

  • инициализировать переменную "флаг" JS в true и изменить ее на false, когда в контексте всего веб-интерфейса;

  • поэтому вы можете использовать вызов типа "willIBeInPhoneGapSometimesInTheNearFuture()" (это PRE-PG, конечно, вам все равно нужен метод проверки POST-PG, если вы можете вызывать PG API, но это тривиально).

  • Затем вы говорите: "but how do you determine the execution context?"; ответ: "вы надеваете" (потому что я не думаю, что вы можете надежно, если только эти блестящие люди в PG не сделают это в своем коде API);

  • вы пишете сборку script, которая сделает это за вас: одна база кода с двумя вариантами.

Ответ 20

На самом деле не ответ на вопрос, но когда я тестирую в настольном браузере, я просто установил значение localstorage, чтобы заставить браузер загружать приложение, отклоняющее deviceready, которое не срабатывает.

function main() {

    // Initiating the app here.
};

/* Listen for ready events from pheongap */
document.addEventListener("deviceready", main, false);

// When testing outside ipad app, use jquerys ready event instead. 
$(function() {

    if (localStorage["notPhonegap"]) {

        main();
    }
});

Ответ 21

Ни одна из них не работает, если вы не удалите файл Javascript PhoneGap из настольной версии приложения, что наносит ущерб моей цели иметь одну кодовую базу.

Другой вариант - использовать папку merges, см. снимок экрана ниже.

Вы можете добавить файлы, зависящие от платформы, или переопределить стандартные.

(он должен делать трюк в некоторых сценариях)

enter image description here


Другими словами: вместо того, чтобы обнаруживать браузер, вы просто не включаете определенные файлы для создания или подключения определенных файлов только для iOS.

Ответ 22

Обнаружение настольного браузера, даже если эмуляция устройства активна

Работает в машинах Windows и Mac. Нужно найти решение для linux Подробнее

var mobileDevice = false;
if(navigator.userAgent.match(/iPhone|iPad|iPod|Android|BlackBerry|IEMobile/))
    mobileDevice = true; 

if(mobileDevice && navigator.platform.match(/Win|Mac/i))
    mobileDevice = false; // This is desktop browser emulator

if(mobileDevice) {
    // include cordova files
}

Ответ 23

Я действительно нашел комбинацию из двух перечисленных здесь методов, которые лучше всего работают, во-первых, проверьте, что квитанция cordova/phonegap может быть доступна, также проверьте, доступно ли устройство. Например:

function _initialize() {
    //do stuff
}

if (window.cordova && window.device) {
    document.addEventListener('deviceready', function () {
      _initialize();
    }, false);
} else {
   _initialize();
}

Ответ 24

Попробуйте этот подход:

/**
 * Returns true if the application is running on an actual mobile device.
 */
function isOnDevice(){
    return navigator.userAgent.match(/(iPhone|iPod|iPad|Android|BlackBerry)/);
}

function isDeviceiOS(){
    return navigator.userAgent.match(/(iPhone)/);
}

/**
 * Method for invoking functions once the DOM and the device are ready. This is
 * a replacement function for the JQuery provided method i.e.
 * $(document).ready(...).
 */
function invokeOnReady(callback){
    $(document).ready(function(){
        if (isOnDevice()) {
            document.addEventListener("deviceready", callback, false);
        } else {
            invoke(callback);
        }
    });
}

Ответ 25

Я использую комбинацию из GeorgeW и mkprogramming:

   if (!navigator.userAgent.match(/(iPhone|iPod|iPad|Android|BlackBerry)/)) {
      onDeviceReady();
   } else if (Phonegap.available){
      onDeviceReady();
   } else {
      console.log('There was an error loading Phonegap.')
   }

Ответ 26

Я предполагаю, что они не так отличаются друг от друга? Ха-ха... не смешно. Кто не думал, что это не проблема? Здесь самое простое решение для ваших соображений. Нажимайте разные файлы на ваш сервер, затем вы делаете это с помощью PhoneGap. Я также временно перейду с помощью http: check, предложенной выше.

var isMobileBrowserAndNotPhoneGap = (document.location.protocol == "http:");

Я заинтересован в том, что вы нажимаете браузеры, поэтому я могу просто удалить изолированный тег script и нажать rebuild [в DW] (в любом случае это будет какая-то очистка для развертывания, так что это может быть одна из этих задач.) В любом случае, я считаю, что это хороший вариант (учитывая, что многое другое не доступно), чтобы эффективно просто вручную прокомментировать вещи с помощью isMobileBrowserAndNotPhoneGap при нажатии на PG). Опять же для меня в моей ситуации я просто удалю тег для файла (изолированного кода), который подталкивает навигатор, когда он является мобильным браузером (это будет намного быстрее и меньше). [Итак, если вы можете изолировать код для этого оптимизированного, но ручного решения.]

Ответ 27

Немного изменен, но отлично работает без каких-либо проблем.

Намерение - загрузить Кордову только тогда, когда на встроенном устройстве, а не на рабочем столе, поэтому я полностью избегаю кордовы в браузере рабочего стола. Тестирование и развитие пользовательского интерфейса и MVVM и поэтому очень удобно.

Поместите этот код, например. в файле cordovaLoader.js

function isEmbedded() {
    return  
    // maybe you can test for better conditions
    //&& /^file:\/{3}[^\/]/i.test(window.location.href) && 
     /ios|iphone|ipod|ipad|android/i.test(navigator.userAgent);
}

if ( isEmbedded() )
{
   var head= document.getElementsByTagName('head')[0];
   var script= document.createElement('script');
   script.type= 'text/javascript';
   script.src= 'cordova-2.7.0.js';
   head.appendChild(script);
}

Затем вместо включения кордовы javascript сам включает cordovaLoader.js

<head>
  <script src="js/cordovaLoader.js"></script>
  <script src="js/jquery.js"></script>
  <script src="js/iscroll.js"></script>
  <script src="js/knockout-2.3.0.js"></script>
</head> 

Простота вашей работы!:)

Ответ 28

if ( "device" in window ) {
    // phonegap
} else {
    // browser
}

Ответ 29

Просто для информации, как в PhoneGap 3.x Мобильная разработка приложений Hotshot

var userLocale = "en-US";
function startApp()
{
// do translations, format numbers, etc.
}
function getLocaleAndStartApp()
{
    navigator.globalization.getLocaleName (
        function (locale) {
            userLocale = locale.value;
            startApp();
        },
        function () {
            // error; start app anyway
            startApp();
        });
}
function executeWhenReady ( callback ) {
    var executed = false;
    document.addEventListener ( "deviceready", function () {
        if (!executed) {
            executed = true;
            if (typeof callback === "function") {
                callback();
            }
        }
    }, false);
    setTimeout ( function () {
        if (!executed) {
            executed = true;
            if (typeof callback === "function") {
                callback();
            }
        }
    }, 1000 );
};
executeWhenReady ( function() {
    getLocaleAndStartApp();
} );

и в структуре YASMF

https://github.com/photokandyStudios/YASMF-Next/blob/master/lib/yasmf/util/core.js#L152

Ответ 30

Я пытался с объектами окна, но это не сработало, поскольку я открывал удаленный url в InAppBrowser. Не удалось. Таким образом, лучший и простой способ добиться этого - добавить строку к URL-адресу, который вам нужно открыть из приложения phonegap. Затем проверьте, добавлено ли к нему место документа.

Ниже приведен простой код для него

var ref = window.open('http://yourdomain.org#phonegap', '_blank', 'location=yes');

Вы увидите, что строка добавлена ​​к URL-адресу "#phonegap". Так что в домене url добавьте следующий script

if(window.location.indexOf("#phonegap") > -1){
     alert("Url Loaded in the phonegap App");
}