PhoneGap: обнаружение при работе в настольном браузере - PullRequest
116 голосов
/ 09 ноября 2011

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

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

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

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

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

Ответы [ 31 ]

1 голос
/ 23 апреля 2015

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

Работает на машинах 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
}
1 голос
/ 05 ноября 2013

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

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();
    }
});
0 голосов
/ 10 июля 2018
if (document.URL.includes('http')) {
    // running in browser
}

Обрабатывает как http, так и https.

0 голосов
/ 12 июля 2012

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

function _initialize() {
    //do stuff
}

if (window.cordova && window.device) {
    document.addEventListener('deviceready', function () {
      _initialize();
    }, false);
} else {
   _initialize();
}
0 голосов
/ 23 декабря 2015

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

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

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

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

if(window.location.indexOf("#phonegap") > -1){
     alert("Url Loaded in the phonegap App");
}
0 голосов
/ 26 июля 2012

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

/**
 * 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);
        }
    });
}
0 голосов
/ 29 сентября 2014

Просто для информации, как в 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

0 голосов
/ 30 августа 2012

Я использую комбинацию того, что 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.')
   }
0 голосов
/ 09 октября 2012

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

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

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

0 голосов
/ 09 сентября 2013
if ( "device" in window ) {
    // phonegap
} else {
    // browser
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...