Tworzę aplikację internetową, która korzysta z PhoneGap: Build dla wersji mobilnej i chcę mieć jedną bazę kodów dla wersji „desktopowej” i mobilnej. Chcę móc wykryć, czy połączenia PhoneGap będą działać (tj. Czy użytkownik urządzenia mobilnego będzie obsługiwał PhoneGap).
Szukałem i nie mogę uwierzyć, że nie ma na to prostego sposobu. Wiele osób przedstawiło sugestie;
- 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
Żadne z nich nie zadziała, chyba że usuniesz plik PhoneGap Javascript z wersji aplikacji na komputery, co jest sprzeczne z moim celem, jakim jest posiadanie jednej bazy kodu.
Jak dotąd jedynym rozwiązaniem, które wymyśliłem, jest węszenie przeglądarki / agenta użytkownika, ale nie jest to co najmniej solidne. Wszelkie lepsze rozwiązania mile widziane!
EDYCJA: Nieznacznie lepszym rozwiązaniem jest próba wywołania funkcji PhoneGap po krótkim czasie - jeśli to nie zadziała, załóżmy, że użytkownik korzysta z przeglądarki internetowej na komputerze.
źródło
Odpowiedzi:
Używam tego kodu:
AKTUALIZACJA
Istnieje wiele innych sposobów wykrywania, czy phonegap działa w przeglądarce, czy nie, oto kolejna świetna opcja:
jak widać tutaj: Wykryj między przeglądarką mobilną a aplikacją PhoneGap
źródło
Napisałem posta o tym kilka dni temu. To najlepsze rozwiązanie, jakie możesz znaleźć (dopóki PhoneGap coś nie wyda, może lub nie), jest krótkie, proste i doskonałe (sprawdziłem to pod każdym możliwym sposobem i platformą).
Ta funkcja będzie działać w 98% przypadków.
Aby ukończyć pozostałe 2% przypadków, wykonaj następujące kroki (wymaga to niewielkiej zmiany w kodzie natywnym):
Utwórz plik o nazwie __phonegap_index.html , którego źródło:
Teraz w wersji natywnej wystarczy zmienić stronę początkową z index.html na __phonegap_index.html na wszystkich platformach PhoneGap. Powiedzmy, że nazwa mojego projektu to przykład , pliki, które musisz zmienić, to (jak w przypadku PhoneGap w wersji 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
(wiersz 56)Wreszcie, możesz go używać w dowolnym miejscu w swojej witrynie, niezależnie od tego, czy działa na PhoneGap, czy nie:
Mam nadzieję, że to pomoże. :-)
źródło
/^file:\/{3}[^\/]/i.test(window.location.href)
ale używamy PhoneGap, na przykład podczas ładowania index.html z innej strony, na config.xml coś takiego<content src="http://10.100.1.147/" />
(cordova || PhoneGap || phonegap)
zgłosi błąd ReferenceError, jeśli którakolwiek z tych zmiennych nie jest zdefiniowana. Powinieneś przetestowaćtypeof cordova !== undefined
, prawda?return ( typeof cordova !== undefined || typeof PhoneGap !== undefined || typeof phonegap !== undefined )
ReferenceError
już z powoduwindow
prefiksu). Pomyślałem, że zwrócę na to uwagę, ponieważ to faktycznie sprawia, że łańcuch komentarzy jest nieaktualny (a zatem nieprawidłowy).Wiem, że udzielono na to odpowiedzi jakiś czas temu, ale „PhoneGap.available” już nie istnieje. Powinieneś użyć:
lub od 1.7, wolę:
EDYTUJ 2019: jak wspomniano w komentarzach, działa to tylko wtedy, gdy nie uwzględnisz cordova lib w kompilacji przeglądarki na komputerze. Oczywiście dobrą praktyką jest uwzględnienie tylko ścisłego minimum plików javascript / html / css dla każdego docelowego urządzenia
źródło
Najbardziej wiarygodnym sposobem stwierdzenia, czy korzystamy z aplikacji cordova / phonegap, jest zmodyfikowanie agenta użytkownika aplikacji cordova przy użyciu tej konfiguracji AppendUserAgent .
Dodatkowo
config.xml
:Wtedy zadzwoń:
Czemu?
window.cordova
idocument.addEventListener('deviceready', function(){});
podlegają warunkom wyścigowymnavigator.standalone
nie działa, gdy<content src="index.html" />
jest to strona internetowa (np.<content src="https://www.example.com/index.html" />
lub z cordova-plugin-remote-injection )źródło
Cordova AppName/v0.0.1
<3 Więc w ten sposób możesz nawet w jakiś sposób użyć tego do śledzenia (ale pamiętaj, że każdy może modyfikować swojego agenta użytkownika, więc nie polegaj na tym w przypadku weryfikacji krytycznych dla bezpieczeństwa)Myślę, że to jest najprostsze:
var isPhoneGap = (location.protocol == "file:")
EDYCJA Dla niektórych osób, które nie działały. Wtedy możesz spróbować (nie testowałem)
źródło
var isPhoneGap = ! /^http/.test(document.location.protocol)
To działa dla mnie (działa 1.7.0)
Przetestowano na komputerowej przeglądarce Chrome i Safari.
źródło
Podobnie jak w przypadku oryginalnego plakatu, korzystam z usługi kompilacji phonegap. Po dwóch dniach i prawie 50 kompilacjach testowych wymyśliłem eleganckie rozwiązanie, które świetnie się sprawdza.
Nie mogłem użyć węszenia UA, ponieważ chciałem przetestować i uruchomić w przeglądarkach mobilnych. Początkowo zdecydowałem się na dość funkcjonalną technikę cobberboya. To nie zadziałało, ponieważ opóźnienie / przekroczenie limitu czasu „howPatientAreWe: 10000” było zbyt uciążliwe przy programowaniu w przeglądarce. A ustawienie go na niższy czasami powodowałoby niepowodzenie testu w trybie aplikacji / urządzenia. Musiał być inny sposób ...
Usługa kompilacji phonegap wymaga
phonegap.js
pominięcia pliku z repozytorium kodu przed przesłaniem plików aplikacji do usługi. Dlatego mogę przetestować jego istnienie, aby określić, czy działa w przeglądarce czy aplikacji.Jeszcze jedno zastrzeżenie, używam również jQueryMobile, więc zarówno jQM, jak i phonegap musiały zostać zainicjowane, zanim mogłem rozpocząć niestandardowe skrypty. Poniższy kod jest umieszczony na początku mojego niestandardowego pliku index.js dla aplikacji (po jQuery, przed jQM). Również dokumentacja kompilacji phonegap mówi, że należy umieścić ją
<script src="phonegap.js"></script>
gdzieś w HTML. Całkowicie go pomijam i ładuję za pomocą $ .getScript (), aby ułatwić testowanie jego istnienia.źródło
Co ciekawe, wiele odpowiedzi, ale nie zawierają one tych trzech opcji:
1 - plik cordova.js ustawi obiekt cordova w zakresie globalnym. Jeśli tak jest, najprawdopodobniej korzystasz z lunety Cordova.
2 - Cordova uruchomi Twoją aplikację w taki sam sposób, jak otworzysz dokument HTML z pulpitu. Zamiast protokołu HTTP użyje PLIKU. Wykrywanie tego da Ci szansę na założenie, że Twoja aplikacja została załadowana lokalnie.
3 - Użyj zdarzenia load skryptu cordova, aby wykryć kontekst. Zawarcie skryptu można łatwo usunąć w procesie kompilacji lub ładowanie skryptu po prostu zakończy się niepowodzeniem w przeglądarce. Aby ta zmienna globalna nie została ustawiona.
Kredyt należy do Damiena Antipy z Adobe
źródło
Używam tej metody:
debug
będzietrue
w środowisku przeglądarki,false
na urządzeniu.źródło
Wydaje się, że jest to wykonalne i użyłem go w produkcji:
Źródło: http://tqcblog.com/2012/05/09/detecting-phonegap-cordova-on-startup/
źródło
Istota problemu polega na tym, że dopóki cordova.device jest niezdefiniowany, twój kod nie może być pewien, czy to dlatego, że Cordova ustaliła, że twoje urządzenie nie jest obsługiwane, czy też dlatego, że cordova wciąż się przygotowuje i urządzenie będzie odpalać później (lub trzecia opcja: cordova nie załadowała się poprawnie).
Jedynym rozwiązaniem jest zdefiniowanie okresu oczekiwania i zdecydowanie, że po tym okresie Twój kod musi zakładać, że urządzenie nie jest obsługiwane. Chciałbym, żeby Cordova ustawiła gdzieś parametr „Próbowaliśmy znaleźć obsługiwane urządzenie i zrezygnowaliśmy”, ale wygląda na to, że nie ma takiego parametru.
Po ustaleniu tego możesz chcieć zrobić coś konkretnego dokładnie w tych sytuacjach, w których nie ma obsługiwanego urządzenia. Jak w moim przypadku ukrywanie linków do rynku aplikacji na urządzeniu.
Ułożyłem razem tę funkcję, która powinna obejmować prawie każdą sytuację. Pozwala zdefiniować program obsługi urządzenia gotowy, moduł obsługi urządzenia nigdy nie gotowy i czas oczekiwania.
źródło
Sposób, w jaki to robię, polega na użyciu zmiennej globalnej, która jest nadpisywana przez wersję cordova.js dostępną tylko w przeglądarce. W twoim głównym pliku html (zwykle
index.html
) mam następujące skrypty, które są zależne od zamówienia:A w środku
cordova.js
mam po prostu:Podczas tworzenia dla urządzenia mobilnego plik cordova.js nie będzie używany (zamiast tego zostanie użyty plik cordova.js specyficzny dla platformy), więc ta metoda ma tę zaletę, że jest w 100% poprawna, niezależnie od protokołów, agentów użytkownika lub biblioteki zmienne (które mogą ulec zmianie). Mogą być inne rzeczy, które powinienem zawrzeć w cordova.js, ale jeszcze nie wiem, czym one są.
źródło
if ( typeof __cordovaRunningOnBrowser__ !== 'undefined' ) { stuff(); }
.. dobrze?Inny sposób, oparty na rozwiązaniu SlavikMe:
Po prostu użyj parametru zapytania przekazanego
index.html
ze źródła PhoneGap. To znaczy w systemie Android zamiastposługiwać się
SlavikMe ma świetną listę miejsc, w których można to zrobić na innych platformach.
Wtedy
index.html
możesz po prostu zrobić to:źródło
<content src="index.html" />
opcję w pliku config.xml na<content src="index.html?cordova=1" />
. Jak dotąd wydaje się, że działa i jest zdecydowanie najlepszym proponowanym tutaj rozwiązaniem.Aby zachować jedną bazę kodu, interesująca jest „platforma”, na której działa kod. Dla mnie ta „platforma” może oznaczać trzy różne rzeczy:
Sposób sprawdzenia platformy:
Uwaga:
To musi być uruchomione dopiero po załadowaniu cordova.js (body onload (...), $ (document) .ready (...))
Opcja „ontouchstart” w pliku document.documentElement będzie obecna w laptopach i monitorach stacjonarnych z ekranem dotykowym, więc będzie zgłaszać przeglądarkę mobilną, nawet jeśli jest to komputer stacjonarny. Istnieją różne sposoby dokładniejszego sprawdzenia, ale używam go, ponieważ nadal obsługuje 99% przypadków, których potrzebuję. Zawsze możesz zastąpić tę żyłkę czymś solidniejszym.
źródło
typeof cordova !== 'undefined'
zamiast łowienia na wyjątek.Aarons, spróbuj
źródło
Rozwiązanie GeorgeWa jest OK, ale nawet na prawdziwym urządzeniu PhoneGap.available jest prawdziwe tylko po załadowaniu rzeczy PhoneGap, np. OnDeviceReady w document.addEventListener ('deviceready', onDeviceReady, false).
Wcześniej, jeśli chcesz wiedzieć, możesz zrobić tak:
To rozwiązanie zakłada, że większość programistów tworzy programy w przeglądarce Chrome lub Firefox.
źródło
Mam ten sam problem.
Skłaniam się ku dodaniu # cordova = true do adresu URL załadowanego przez klienta cordova i przetestowaniu na mojej stronie internetowej pod kątem location.hash.indexOf ("cordova = true")> -1.
źródło
Poniższe działa dla mnie z najnowszym PhoneGap / Cordova (2.1.0).
Jak to działa:
Zalety:
Niedogodności:
==
Utwórz zupełnie nowy, pusty projekt PhoneGap. W podanym przykładowym pliku index.js zamień zmienną „app” na dole na następującą:
źródło
Natknąłem się na ten problem kilka miesięcy temu podczas uruchamiania naszej aplikacji, ponieważ chcieliśmy, aby aplikacja była „
browser-compatible
" (ze zrozumieniem, że w tym scenariuszu niektóre funkcje byłyby zablokowane: nagrywanie dźwięku, kompas itp.).Jedynym
100%
(i nalegam na warunek 100-procentowy), aby WSTĘPNIE określić kontekst wykonania aplikacji, było to:zainicjuj zmienną „flag” JS na wartość true i zmień ją na false w kontekście obejmującym całą sieć;
dlatego możesz użyć wywołania takiego jak "
willIBeInPhoneGapSometimesInTheNearFuture()
" (to jest PRE-PG, oczywiście nadal potrzebujesz metody POST-PG do sprawdzania, czy możesz wywoływać API PG, ale ta jest trywialna).Wtedy mówisz: „
but how do you determine the execution context
?”; odpowiedź brzmi: „nie” (ponieważ nie sądzę, że możesz niezawodnie, chyba że ci genialni ludzie z PG zrobiliby to w swoim kodzie API);piszesz skrypt budujący, który zrobi to za Ciebie: jedna baza kodu z dwoma wariantami.
źródło
Naprawdę nie jest to odpowiedź na pytanie, ale kiedy testuję w przeglądarce na komputerze, po prostu ustawiam wartość localstorage, aby przeglądarka ładowała aplikację, ale urządzenie nie uruchamia się.
źródło
Inną opcją byłoby użycie połączeń folderu , patrz zrzut ekranu poniżej.
Możesz dodać pliki specyficzne dla platformy / zastąpić domyślne.
(w niektórych sytuacjach powinno to załatwić sprawę)
Innymi słowy: Zamiast wykrywać przeglądarkę, po prostu nie dołączasz niektórych plików do kompilacji na komputer / dołączasz tylko niektóre pliki tylko dla iOS.
źródło
Wykryj przeglądarkę na komputerze, nawet jeśli emulacja urządzenia jest aktywna
Działa na komputerach z systemem Windows i Mac. Trzeba znaleźć rozwiązanie dla systemu Linux Zobacz szczegóły
źródło
Właściwie odkryłem, że połączenie dwóch z wymienionych tutaj technik działa najlepiej, najpierw sprawdź, czy można uzyskać dostęp do cordova / phonegap, sprawdź także, czy urządzenie jest dostępne. Tak jak to:
źródło
Wypróbuj to podejście:
źródło
Używam kombinacji tego, co zasugerowali GeorgeW i mkprogramming :
źródło
Myślę, że w jakiś sposób nie są aż tak różni, prawda? Ha ha ... nie zabawne. Kto nie pomyślał, że to nie będzie problem? Oto najprostsze rozwiązanie dla twoich rozważań. Wysyłaj różne pliki na swój serwer, a następnie do PhoneGap. Chwilowo też skorzystam z http: check sugerowanego powyżej.
Interesuje mnie przesunięcie paska nawigacyjnego przeglądarki w górę, więc naprawdę mogę po prostu usunąć tag izolowanego skryptu i nacisnąć przycisk odbuduj [w DW] (i tak będą to jakieś porządki do wdrożenia, więc może to być jedno z tych zadań). W każdym razie czuję jest to dobra opcja (biorąc pod uwagę, że niewiele więcej jest dostępnych), aby skutecznie po prostu ręcznie komentować rzeczy za pomocą isMobileBrowserAndNotPhoneGap podczas wypychania do PG). Znowu dla mnie w mojej sytuacji po prostu usunę tag dla pliku (izolowanego kodu), który wypycha pasek nawigacyjny, gdy jest to przeglądarka mobilna (będzie o wiele szybsza i mniejsza). [A więc jeśli możesz wyodrębnić kod dla tego zoptymalizowanego, ale ręcznego rozwiązania.]
źródło
Nieznacznie zmodyfikowany, ale działa dla mnie idealnie bez żadnych problemów.
Intencją jest ładowanie Cordova tylko na urządzeniu wbudowanym, a nie na pulpicie, więc całkowicie unikam Cordova w przeglądarce na komputerze. Testowanie i rozwój interfejsu użytkownika i MVVM, a więc jest to bardzo wygodne.
Umieść ten kod np. w pliku cordovaLoader.js
Następnie zamiast włączać sam JavaScript cordova, dołącz cordovaLoader.js
Ułatw sobie pracę! :)
źródło
źródło
Tylko po informacje, jak w PhoneGap 3.x Mobile Application Development Hotshot
oraz w ramach YASMF
https://github.com/photokandyStudios/YASMF-Next/blob/master/lib/yasmf/util/core.js#L152
źródło
Próbowałem z obiektami okna, ale nie zadziałało, ponieważ otwierałem zdalny adres URL w InAppBrowser. Nie mogłem tego zrobić. Dlatego najlepszym i najłatwiejszym sposobem na osiągnięcie tego było dodanie ciągu znaków do adresu URL, który należy otworzyć z aplikacji phonegap. Następnie sprawdź, czy lokalizacja dokumentu ma dołączony ciąg.
Zobaczysz, że do adresu URL „#phonegap” został dodany ciąg. Dlatego w adresie URL domeny dodaj następujący skrypt
źródło