Я разрабатываю веб-приложение, использующее PhoneGap: Build для мобильной версии и хочу иметь единую базу кода для «настольной» и мобильной версий. Я хочу иметь возможность определять, будут ли работать вызовы PhoneGap (т. Е. Есть ли у пользователя мобильное устройство, поддерживающее PhoneGap).
Я искал и не могу поверить, что нет простого способа сделать это. Многие люди предлагали свои предложения;
- http://www.sencha.com/forum/showthread.php?144127-Checking-if-running-in-PhoneGap-or-Mobile-Web-Browser
- http://groups.google.com/group/phonegap/browse_thread/thread/322e80bd41bb1a54/a421300eb2a2029f?lnk=gst&q=detect+desktop#a421300eb2a2029f
- http://groups.google.com/group/phonegap/browse_thread/thread/8a95dfeb0f313792/3ff10d8f35211739?lnk=gst&q=detect+desktop+browser#3ff10d8f35211739
Ничего из этого не сработает, если вы не удалите файл Javascript PhoneGap из настольной версии приложения, что противоречит моей цели иметь единую базу кода.
Пока что единственным решением, которое я придумал, является обнюхивание браузера / пользовательского агента, но это, мягко говоря, не надежно. Приветствуются любые лучшие решения!
РЕДАКТИРОВАТЬ: немного лучшим решением является попытка вызвать функцию PhoneGap после небольшого тайм-аута - если это не сработает, предположим, что пользователь находится в настольном веб-браузере.
источник
Ответы:
Я использую этот код:
ОБНОВИТЬ
Есть много других способов определить, работает ли телефонная связь в браузере или нет, вот еще один отличный вариант:
как показано здесь: обнаружение между мобильным браузером или приложением PhoneGap
источник
Я написал пост об этом несколько дней назад. Это лучшее решение, которое вы можете найти (до тех пор, пока PhoneGap что-то не выпустит, а может и нет), оно короткое, простое и идеальное (я проверял его всеми возможными способами и платформами).
Эта функция будет работать в 98% случаев.
Чтобы завершить остальные 2% случаев, выполните следующие действия (это предполагает небольшое изменение собственного кода):
Создайте файл с именем __phonegap_index.html с источником:
Теперь на нативном языке просто измените стартовую страницу с index.html на __phonegap_index.html на всех ваших платформах PhoneGap. Скажем, мое имя проекта является примером , файлы, которые вам нужно изменить (как для PhoneGap версии 2.2.0):
CordovaLibApp/AppDelegate.m
src/org/apache/cordova/example/cordovaExample.java
example/package.appxmanifest
www/config.xml
framework/appinfo.json
src/WebForm.cpp
(строка 56)Наконец, вы можете использовать его где угодно на своем сайте, независимо от того, работает он на PhoneGap или нет:
Надеюсь, поможет. :-)
источник
/^file:\/{3}[^\/]/i.test(window.location.href)
но мы используем PhoneGap, например, при загрузке index.html с другой страницы, на config.xml что-то вроде этого<content src="http://10.100.1.147/" />
(cordova || PhoneGap || phonegap)
вызовет ошибку ReferenceError, если какая-либо из этих переменных не определена. Тебе следует проверитьtypeof cordova !== undefined
, верно?return ( typeof cordova !== undefined || typeof PhoneGap !== undefined || typeof phonegap !== undefined )
ReferenceError
из-заwindow
префикса). Просто подумал, что я укажу на это, поскольку это фактически делает цепочку комментариев устаревшей (и, следовательно, неправильной).Я знаю, что на него ответили некоторое время назад, но "PhoneGap.available" больше не существует. Вам следует использовать:
или с версии 1.7 предпочтительнее:
РЕДАКТИРОВАТЬ 2019: как сказано в комментариях, это работает только в том случае, если вы не включите cordova lib в сборку настольного браузера. И, конечно же, рекомендуется включать только строгий минимум файлов javascript / html / css для каждого целевого устройства.
источник
Самый надежный способ узнать, находимся ли мы в приложении cordova / phonegap, - это изменить пользовательский агент этого приложения с помощью этой конфигурации AppendUserAgent .
Дополнительно
config.xml
:Тогда звоните:
Зачем?
window.cordova
иdocument.addEventListener('deviceready', function(){});
подпадают под условия гонокnavigator.standalone
не работает, когда<content src="index.html" />
это веб-сайт (например,<content src="https://www.example.com/index.html" />
или с cordova-plugin-remote-injection )источник
Cordova AppName/v0.0.1
<3 Таким образом, вы даже можете каким-то образом использовать это для отслеживания (но учтите, что любой может изменить его пользовательский агент, поэтому не полагайтесь на него для критически важных проверок безопасности)Думаю, это проще всего:
var isPhoneGap = (location.protocol == "file:")
ИЗМЕНИТЬ Для некоторых людей это не сработало. Тогда вы можете попробовать (не тестировали)
источник
var isPhoneGap = ! /^http/.test(document.location.protocol)
Это работает для меня (работает 1.7.0)
Проверено на настольных компьютерах Chrome и Safari.
источник
Как и в оригинальном плакате, я использую службу создания телефонных разговоров. После двух дней и почти 50 тестовых сборок я придумал элегантное решение, которое мне отлично подходит.
Я не мог использовать сниффинг UA, потому что хотел протестировать и запустить в мобильных браузерах. Изначально я остановился на довольно функциональной технике cobberboy. У меня это не сработало, потому что задержка / тайм-аут "howPatientAreWe: 10000" слишком мешала разработке в браузере. А установка более низкого значения иногда проваливала бы тест в режиме приложения / устройства. Должен был быть другой способ ...
Служба сборки телефонной связи требует, чтобы
phonegap.js
файл был исключен из репозитория кода перед отправкой файлов вашего приложения в службу. Поэтому я могу проверить его существование, чтобы определить, работает ли он в браузере или в приложении.Еще одно предостережение: я также использую jQueryMobile, поэтому и jQM, и phonegap должны быть инициализированы, прежде чем я смогу начать любой пользовательский скрипт. Следующий код помещен в начало моего настраиваемого файла index.js для приложения (после jQuery, перед jQM). Также в документации по сборке телефонного разговора говорится, что нужно разместить
<script src="phonegap.js"></script>
где-нибудь в HTML. Я полностью оставляю его и загружаю с помощью $ .getScript () для проверки его существования.источник
Интересно, что ответов много, но они не включают эти три варианта:
1 - Cordova.js установит объект cordova в глобальную область. Если он там есть, то вы, скорее всего, работаете с прицелом Cordova.
2 - Cordova запустит ваше приложение, как если бы вы открывали HTML-документ со своего рабочего стола. Вместо протокола HTTP он будет использовать ФАЙЛ. Обнаружение этого даст вам возможность предположить, что ваше приложение было загружено локально.
3 - Используйте событие загрузки скрипта Cordova для определения контекста. Включение скрипта можно легко удалить в процессе сборки, иначе загрузка скрипта в браузере просто не удастся. Так что эта глобальная переменная не будет установлена.
Благодарим Дэмиена Антипа из Adobe
источник
Я использую такой способ:
debug
будетtrue
в среде браузераfalse
на устройстве.источник
Это кажется жизнеспособным, и я использовал его в производстве:
Источник: http://tqcblog.com/2012/05/09/detecting-phonegap-cordova-on-startup/
источник
Суть проблемы заключается в том, что пока cordova.device не определен, ваш код не может быть уверен, что это потому, что cordova установила, что ваше устройство не поддерживается, или потому, что cordova все еще готовится, а deviceready сработает позже. (или третий вариант: кордова не загрузилась должным образом).
Единственное решение - определить период ожидания и решить, что после этого периода ваш код должен предполагать, что устройство не поддерживается. Я бы хотел, чтобы кордова установила параметр где-нибудь, чтобы сказать «Мы пытались найти поддерживаемое устройство, но отказались», но похоже, что такого параметра нет.
Как только это будет установлено, вы можете захотеть сделать что-то конкретное именно в тех ситуациях, когда нет поддерживаемого устройства. В моем случае вроде скрытия ссылок на магазин приложений устройства.
Я собрал по кусочкам эту функцию, которая должна охватывать практически любую ситуацию. Он позволяет вам определять обработчик готовности устройства, обработчик готовности устройства и время ожидания.
источник
Я делаю это с помощью глобальной переменной, которая перезаписывается версией cordova.js только для браузера. В вашем основном файле html (обычно
index.html
) у меня есть следующие сценарии, которые зависят от порядка:А внутри
cordova.js
у меня просто:При сборке для мобильного устройства cordova.js не будет использоваться (вместо этого будет использоваться файл cordova.js для конкретной платформы), поэтому этот метод имеет то преимущество, что он на 100% верен независимо от протоколов, агентов пользователя или библиотеки. переменные (которые могут измениться). Могут быть и другие вещи, которые мне следует включить в cordova.js, но я еще не знаю, что это такое.
источник
if ( typeof __cordovaRunningOnBrowser__ !== 'undefined' ) { stuff(); }
правильно?Другой способ, основанный на решении SlavikMe:
Просто используйте параметр запроса, переданный
index.html
из вашего источника PhoneGap. Т.е. в Android вместоиспользование
У SlavikMe есть отличный список того, где это можно сделать на других платформах.
Тогда вы
index.html
можете просто сделать это:источник
<content src="index.html" />
параметр в файле config.xml на<content src="index.html?cordova=1" />
. Пока что это работает, и это, безусловно, лучшее решение, предлагаемое здесь.Чтобы сохранить единую базу кода, нас интересует «платформа», на которой выполняется код. Для меня эта «платформа» может быть тремя разными вещами:
Способ проверки платформы:
Примечание:
Это нужно запускать только после загрузки cordova.js (body onload (...), $ (document) .ready (...))
'ontouchstart' в document.documentElement будет присутствовать в ноутбуках и настольных мониторах с сенсорным экраном, поэтому он будет сообщать о мобильном браузере, даже если это настольный компьютер. Есть разные способы сделать более точную проверку, но я использую его, потому что он по-прежнему выполняет 99% необходимых мне дел. Вы всегда можете заменить эту строку чем-нибудь более надежным.
источник
typeof cordova !== 'undefined'
вместо рыбалки для исключения.Ааронс, попробуй
источник
Решение GeorgeW в порядке, но даже на реальном устройстве PhoneGap.available истинно только после того, как были загружены вещи PhoneGap, например onDeviceReady в document.addEventListener ('deviceready', onDeviceReady, false).
До этого времени, если вы хотите знать, вы можете сделать так:
Это решение предполагает, что большинство разработчиков разрабатывают с использованием Chrome или Firefox.
источник
У меня такая же проблема.
Я склоняюсь к добавлению # cordova = true к URL-адресу, загружаемому клиентом cordova, и тестированию на location.hash.indexOf ("cordova = true")> -1 на моей веб-странице.
источник
Следующее работает для меня с последней версией PhoneGap / Cordova (2.1.0).
Как это устроено:
Преимущества:
Недостатки:
==
Создайте новый пустой проект PhoneGap. В предоставленном образце index.js замените переменную app внизу следующим образом:
источник
Я столкнулся с этой проблемой несколько месяцев назад, когда запускал наше приложение, потому что мы хотели, чтобы приложение было "
browser-compatible
тоже " (с пониманием того, что некоторые функции будут заблокированы в этом сценарии: запись звука, компас и т. Д.).Единственное
100%
(и я настаиваю на 100-процентном условии) решение для ПРЕДВАРИТЕЛЬНОГО определения контекста выполнения приложения было следующее:инициализировать JS-переменную "flag" значением true и изменить ее на false во всем веб-контексте;
поэтому вы можете использовать вызов типа "
willIBeInPhoneGapSometimesInTheNearFuture()
" (это PRE-PG, конечно, вам все еще нужен метод POST-PG для проверки того, можете ли вы вызывать API PG, но это тривиально).Затем вы говорите: «
but how do you determine the execution context
?»; ответ: «нет» (потому что я не думаю, что вы можете надежно, если только эти блестящие ребята из PG не сделают это в своем коде API);вы пишете сценарий сборки, который сделает это за вас: одна кодовая база с двумя вариантами.
источник
Не совсем ответ на вопрос, но когда я тестирую в браузере настольного компьютера, я просто устанавливаю значение localstorage, чтобы браузер загружал приложение, несмотря на то, что устройство уже не запускается.
источник
Другой вариант - использовать слияния папку , см. Снимок экрана ниже.
Вы можете добавлять файлы для конкретной платформы / отменять файлы по умолчанию.
(он должен помочь в некоторых сценариях)
Другими словами: вместо того, чтобы определять браузер, вы просто не включаете определенные файлы для сборки на рабочем столе / не прикрепляете определенные файлы только для iOS.
источник
Обнаружение настольного браузера, даже если эмуляция устройства активна
Работает на машинах Windows и Mac. Нужно найти решение для linux Подробнее
источник
На самом деле я обнаружил, что комбинация двух методов, перечисленных здесь, работает лучше всего. Во-первых, проверьте, есть ли доступ к кордове / телефонному разговору, а также проверьте, доступно ли устройство. Вот так:
источник
Попробуйте такой подход:
источник
Я использую комбинацию того, что предлагали GeorgeW и mkprogramming :
источник
Я думаю, что в чем-то они не такие уж разные, не так ли? Ха-ха ... не смешно. Кто не думал, что это не проблема? Вот самое простое решение для ваших соображений. Отправляйте разные файлы на свой сервер, а затем в PhoneGap. Я бы также временно использовал http: check, предложенный выше.
Я заинтересован в том, чтобы поднять панель навигации браузеров вверх, так что на самом деле я могу просто удалить тег изолированного скрипта и нажать rebuild [в DW] (они все равно будут очищать для развертывания, так что это может быть одной из этих задач). В любом случае, я чувствую это хороший вариант (учитывая, что больше ничего не доступно), чтобы просто вручную комментировать вещи с помощью isMobileBrowserAndNotPhoneGap при нажатии на PG). Опять же, в моей ситуации я просто удалю тег для файла (изолированного кода), который поднимает панель навигации, когда это мобильный браузер (он будет намного быстрее и меньше). [Так что, если вы можете выделить код для этого оптимизированного, но ручного решения.]
источник
Немного изменен, но у меня работает отлично, без проблем.
Намерение состоит в том, чтобы загружать Cordova только на встроенном устройстве, а не на рабочем столе, поэтому я полностью избегаю Cordova в браузере для настольных компьютеров. Тестирование и разработка пользовательского интерфейса и MVVM очень удобны.
Поместите этот код, например. в файле cordovaLoader.js
Затем вместо включения самого кордовского javascript включите cordovaLoader.js
Упростите себе работу! :)
источник
источник
Просто для информации в разделе " Горячий снимок" по разработке мобильных приложений PhoneGap 3.x.
и в рамках YASMF
https://github.com/photokandyStudios/YASMF-Next/blob/master/lib/yasmf/util/core.js#L152
источник
Я пытался использовать объекты окна, но это не сработало, так как я открывал удаленный URL-адрес в InAppBrowser. Не удалось это сделать. Итак, лучший и самый простой способ добиться этого - добавить строку к URL-адресу, который вам нужно открыть из приложения телефонной связи. Затем проверьте, не добавлена ли к месту расположения документа строка.
Вы увидите, что к URL-адресу добавлена строка "#phonegap". Поэтому в URL-адрес домена добавьте следующий скрипт
источник