Ich entwickle eine Webanwendung, die PhoneGap: Build für eine mobile Version verwendet, und möchte eine einzige Codebasis für die Desktop- und die mobile Version haben. Ich möchte erkennen können, ob PhoneGap-Anrufe funktionieren (dh der Benutzer auf einem mobilen Gerät, der PhoneGap unterstützt).
Ich habe gesucht und kann nicht glauben, dass es keinen einfachen Weg gibt, dies zu tun. Viele Leute haben Vorschläge gemacht;
- 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
Nichts davon funktioniert, es sei denn, Sie entfernen die PhoneGap-Javascript-Datei aus der Desktop-Version der App, was mein Ziel, eine Codebasis zu haben, zunichte macht.
Bisher ist die einzige Lösung, die ich gefunden habe, das Schnüffeln von Browsern / Benutzeragenten, aber das ist gelinde gesagt nicht robust. Bessere Lösungen sind willkommen!
BEARBEITEN: Eine geringfügig bessere Lösung besteht darin, nach einer kurzen Zeitüberschreitung zu versuchen, eine PhoneGap-Funktion aufzurufen. Wenn dies nicht funktioniert, wird davon ausgegangen, dass sich der Benutzer in einem Desktop-Webbrowser befindet.
quelle
Antworten:
Ich benutze diesen Code:
AKTUALISIEREN
Es gibt viele andere Möglichkeiten, um festzustellen, ob Phonegap in einem Browser ausgeführt wird oder nicht. Hier ist eine weitere großartige Option:
wie hier zu sehen: Erkennen zwischen einem mobilen Browser oder einer PhoneGap-Anwendung
quelle
Ich habe vor ein paar Tagen einen Beitrag darüber geschrieben. Dies ist die beste Lösung, die Sie finden können (bis PhoneGap etwas veröffentlicht, vielleicht oder vielleicht auch nicht). Sie ist kurz, einfach und perfekt (ich habe sie auf jede mögliche Weise und Plattform überprüft).
Diese Funktion erledigt die Arbeit in 98% der Fälle.
Führen Sie die folgenden Schritte aus, um die anderen 2% der Fälle abzuschließen (dies erfordert eine geringfügige Änderung des nativen Codes):
Erstellen Sie eine Datei mit dem Namen __phonegap_index.html mit der Quelle:
Ändern Sie jetzt auf nativ einfach die Startseite von index.html in __phonegap_index.html auf allen Ihren PhoneGap-Plattformen. Angenommen, mein Projektname ist ein Beispiel . Die Dateien, die Sie ändern müssen, sind (wie bei PhoneGap Version 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
(Linie 56)Schließlich können Sie es überall auf Ihrer Site verwenden, unabhängig davon, ob es auf PhoneGap ausgeführt wird oder nicht:
Ich hoffe es hilft. :-)
quelle
/^file:\/{3}[^\/]/i.test(window.location.href)
aber wir verwenden PhoneGap, zum Beispiel beim Laden der index.html von einer anderen Seite, auf config.xml so etwas<content src="http://10.100.1.147/" />
(cordova || PhoneGap || phonegap)
löst einen ReferenceError aus, wenn eine dieser Variablen nicht definiert ist. Du solltest mit testentypeof cordova !== undefined
, oder?return ( typeof cordova !== undefined || typeof PhoneGap !== undefined || typeof phonegap !== undefined )
ReferenceError
aufgrund deswindow
Präfixes keine mehr ). Ich dachte nur, ich würde darauf hinweisen, da dies die Kommentarkette tatsächlich veraltet (und damit falsch) macht.Ich weiß, dass es vor einiger Zeit beantwortet wurde, aber "PhoneGap.available" existiert nicht mehr. Du solltest benutzen:
oder seit 1.7 bevorzugen:
EDIT 2019: Wie in den Kommentaren erwähnt, funktioniert dies nur, wenn Sie cordova lib nicht in Ihren Desktop-Browser-Build aufnehmen. Und natürlich ist es eine gute Praxis, nur die strengen Mindestanforderungen an Javascript / HTML / CSS für jedes Gerät, auf das Sie abzielen, einzuschließen
quelle
Die vertrauenswürdigste Methode, um festzustellen, ob wir uns in einer Cordova / Phonegap-Anwendung befinden, besteht darin, den Benutzeragenten der Cordova-Anwendung mithilfe dieser Konfiguration AppendUserAgent zu ändern .
In
config.xml
add:Dann ruf an:
Warum?
window.cordova
unddocument.addEventListener('deviceready', function(){});
unterliegen Rennbedingungennavigator.standalone
funktioniert nicht, wenn<content src="index.html" />
es sich um eine Website handelt (Beispiel:<content src="https://www.example.com/index.html" />
oder mit Cordova-Plugin-Remote-Injection )quelle
Cordova AppName/v0.0.1
<3 Auf diese Weise können Sie dies sogar irgendwie für die Nachverfolgung verwenden (beachten Sie jedoch, dass jeder seinen Benutzeragenten ändern kann, sodass Sie sich bei sicherheitskritischen Überprüfungen nicht darauf verlassen können)Ich denke das ist am einfachsten:
var isPhoneGap = (location.protocol == "file:")
BEARBEITEN Für einige Leute, die nicht funktionierten. Dann könnten Sie versuchen (nicht getestet)
quelle
var isPhoneGap = ! /^http/.test(document.location.protocol)
Das funktioniert bei mir (läuft 1.7.0)
Getestet auf Desktop Chrome und Safari.
quelle
Wie das Originalposter verwende ich den Phonegap-Build-Service. Nach zwei Tagen und fast 50 Testversionen habe ich eine elegante Lösung gefunden, die für mich hervorragend funktioniert.
Ich konnte UA-Sniffing nicht verwenden, weil ich es in mobilen Browsern testen und ausführen wollte. Ich hatte mich ursprünglich für Cobberboys ziemlich funktionale Technik entschieden. Dies hat bei mir nicht funktioniert, da die Verzögerung / das Timeout "howPatientAreWe: 10000" für die Entwicklung im Browser zu störend war. Wenn Sie den Wert niedriger einstellen, schlägt der Test im App- / Gerätemodus gelegentlich fehl. Es musste einen anderen Weg geben ...
Für den Phonegap-Erstellungsdienst muss die
phonegap.js
Datei aus Ihrem Code-Repository entfernt werden, bevor die Dateien Ihrer App an den Dienst gesendet werden. Daher kann ich die Existenz testen, um festzustellen, ob sie in einem Browser oder in einer App ausgeführt wird.Eine weitere Einschränkung: Ich verwende auch jQueryMobile, sodass sowohl jQM als auch Phonegap initialisiert werden mussten, bevor ich mit benutzerdefinierten Skripten beginnen konnte. Der folgende Code steht am Anfang meiner benutzerdefinierten Datei index.js für die App (nach jQuery, vor jQM). Auch die Phonegap-Build-Dokumente sagen, dass sie
<script src="phonegap.js"></script>
irgendwo im HTML- Code platziert werden sollen . Ich lasse es komplett weg und lade es mit $ .getScript (), um seine Existenz zu testen.quelle
Interessanterweise viele Antworten, aber diese drei Optionen sind nicht enthalten:
1 - Die Datei cordova.js legt das Cordova-Objekt im globalen Bereich fest. Wenn es dort vorhanden ist, werden Sie höchstwahrscheinlich in einem Cordova-Bereich ausgeführt.
2 - Cordova führt Ihre Anwendung so aus, als würden Sie ein HTML-Dokument von Ihrem Desktop aus öffnen. Anstelle des HTTP-Protokolls wird FILE verwendet. Wenn Sie dies erkennen, können Sie davon ausgehen, dass Ihre App lokal geladen wurde.
3 - Verwenden Sie das Ladeereignis des Cordova-Skripts, um den Kontext zu erkennen. Das Skript-Include kann während des Erstellungsprozesses leicht entfernt werden, oder das Laden des Skripts schlägt in einem Browser einfach fehl. Damit diese globale Variable nicht gesetzt wird.
Der Kredit geht an Damien Antipa von Adobe
quelle
Ich benutze diese Methode:
debug
wird intrue
der Browser-Umgebungfalse
auf dem Gerät sein.quelle
Dies scheint machbar zu sein und ich habe es in der Produktion verwendet:
Quelle: http://tqcblog.com/2012/05/09/detecting-phonegap-cordova-on-startup/
quelle
Das Wesentliche des Problems ist, dass Ihr Code, solange cordova.device nicht definiert ist, nicht sicher sein kann, ob Cordova festgestellt hat, dass Ihr Gerät nicht unterstützt wird, oder ob Cordova sich noch vorbereitet und deviceready später ausgelöst wird (oder dritte Option: Cordova wurde nicht richtig geladen).
Die einzige Lösung besteht darin, eine Wartezeit zu definieren und zu entscheiden, dass Ihr Code nach dieser Zeit davon ausgehen muss, dass das Gerät nicht unterstützt wird. Ich wünschte, Cordova würde irgendwo einen Parameter setzen, der besagt: "Wir haben versucht, ein unterstütztes Gerät zu finden und aufgegeben", aber es scheint, als gäbe es keinen solchen Parameter.
Sobald dies eingerichtet ist, möchten Sie möglicherweise genau in Situationen Situationen ausführen, in denen kein unterstütztes Gerät vorhanden ist. In meinem Fall wie das Verstecken von Links zum App-Markt des Geräts.
Ich habe diese Funktion zusammengestellt, die so ziemlich jede Situation abdecken sollte. Hier können Sie einen Geräte-Handler, einen Handler, der niemals bereit ist, und eine Wartezeit definieren.
quelle
Ich verwende eine globale Variable, die von einer Nur-Browser-Version von cordova.js überschrieben wird. In Ihrer Haupt-HTML-Datei habe
index.html
ich (normalerweise ) die folgenden Skripte, die auftragsabhängig sind:Und drinnen habe
cordova.js
ich einfach:Beim Erstellen für ein mobiles Gerät wird die Datei cordova.js nicht verwendet (und stattdessen wird die plattformspezifische Datei cordova.js verwendet). Daher hat diese Methode den Vorteil, dass sie unabhängig von Protokollen, Benutzeragenten oder Bibliotheken zu 100% korrekt ist Variablen (die sich ändern können). Es mag andere Dinge geben, die ich in cordova.js aufnehmen sollte, aber ich weiß noch nicht, was sie sind.
quelle
if ( typeof __cordovaRunningOnBrowser__ !== 'undefined' ) { stuff(); }
ob es überhaupt eingestellt ist: .. richtig?Ein anderer Weg, basierend auf der Lösung von SlavikMe:
Verwenden Sie einfach einen Abfrageparameter, der
index.html
von Ihrer PhoneGap-Quelle übergeben wurde. Dh in Android stattverwenden
SlavikMe hat eine großartige Liste, wo dies auf anderen Plattformen zu tun ist.
Dann
index.html
können Sie einfach Folgendes tun:quelle
<content src="index.html" />
Option in der Datei config.xml in ändern<content src="index.html?cordova=1" />
. Bisher scheint es zu funktionieren und ist bei weitem die beste hier vorgeschlagene Lösung.Um eine Codebasis beizubehalten, ist die "Plattform" von Interesse, auf der der Code ausgeführt wird. Für mich kann diese "Plattform" drei verschiedene Dinge sein:
So überprüfen Sie die Plattform:
Hinweis:
Dies muss erst ausgeführt werden, nachdem cordova.js geladen wurde (body onload (...), $ (document) .ready (...))
'ontouchstart' in document.documentElement ist in Laptops und Desktop-Monitoren vorhanden, die über einen Touchscreen verfügen, sodass ein mobiler Browser gemeldet wird, obwohl es sich um einen Desktop handelt. Es gibt verschiedene Möglichkeiten, eine genauere Prüfung durchzuführen, aber ich verwende sie, da sie immer noch 99% der Fälle erledigt, die ich benötige. Sie können diese Linie jederzeit durch etwas Robusteres ersetzen.
quelle
typeof cordova !== 'undefined'
anstelle einer Ausnahme zu fischen.Aarons, versuch es
quelle
Die Lösung von GeorgeW ist in Ordnung, aber selbst auf einem realen Gerät ist PhoneGap.available erst wahr, nachdem die Dinge von PhoneGap geladen wurden, z. B. onDeviceReady in document.addEventListener ('deviceready', onDeviceReady, false).
Wenn Sie vor dieser Zeit wissen möchten, können Sie Folgendes tun:
Diese Lösung setzt voraus, dass die meisten Entwickler mit Chrome oder Firefox entwickeln.
quelle
Ich habe das gleiche Problem.
Ich neige dazu, # cordova = true zu der vom cordova-Client geladenen URL hinzuzufügen und auf location.hash.indexOf ("cordova = true")> -1 auf meiner Webseite zu testen.
quelle
Folgendes funktioniert für mich mit der neuesten PhoneGap / Cordova (2.1.0).
Wie es funktioniert:
Vorteile:
Nachteile:
==
Erstellen Sie ein brandneues leeres PhoneGap-Projekt. Ersetzen Sie in der bereitgestellten Beispielindex.js die Variable "app" unten durch folgende:
quelle
Ich bin vor einigen Monaten auf dieses Problem gestoßen, als wir unsere App gestartet haben, weil wir wollten, dass die App "
browser-compatible
" ist (mit dem Verständnis, dass einige Funktionen in diesem Szenario blockiert sind: Audioaufzeichnung, Kompass usw.).Die einzige
100%
(und ich bestehe auf der 100-prozentigen Bedingung) Lösung, um den Kontext der App-Ausführung vorab zu bestimmen, war folgende:Initialisieren Sie eine JS-Flag-Variable auf true und ändern Sie sie in einem All-Web-Kontext in false.
Daher können Sie einen Aufruf wie "
willIBeInPhoneGapSometimesInTheNearFuture()
" verwenden (das ist PRE-PG, natürlich benötigen Sie noch eine POST-PG-Methode, um zu überprüfen, ob Sie PG-APIs aufrufen können, aber diese ist trivial).Dann sagst du: "
but how do you determine the execution context
?"; Die Antwort lautet: "Sie tun es nicht" (weil ich nicht glaube, dass Sie es zuverlässig können, es sei denn, diese brillanten Leute bei PG würden es in ihrem API-Code tun);Sie schreiben ein Build-Skript, das dies für Sie erledigt: eine Codebasis mit zwei Varianten.
quelle
Keine wirkliche Antwort auf die Frage, aber wenn ich in einem Desktop-Browser teste, lege ich einfach einen lokalen Speicherwert fest, damit der Browser die App lädt, obwohl das Gerät nicht ausgelöst wird.
quelle
Eine andere Möglichkeit wäre die Verwendung Merges Ordner, siehe Screenshot unten.
Sie können plattformspezifische Dateien hinzufügen / Standarddateien überschreiben.
(Es sollte in einigen Szenarien den Trick machen)
Mit anderen Worten: Anstatt den Browser zu erkennen, fügen Sie bestimmte Dateien nicht für den Desktop ein. Erstellen / Anhängen bestimmter Dateien nur für iOS.
quelle
Erkennen Sie den Desktop-Browser auch dann, wenn das Emulationsgerät aktiv ist
Funktioniert auf Windows- und Mac-Computern. Sie müssen eine Lösung für Linux finden. Details anzeigen
quelle
Ich habe tatsächlich festgestellt, dass eine Kombination aus zwei der hier aufgeführten Techniken am besten funktioniert hat. Überprüfen Sie zunächst, ob auf Cordova / Phonegap zugegriffen werden kann, und prüfen Sie, ob das Gerät verfügbar ist. Wie so:
quelle
Versuchen Sie diesen Ansatz:
quelle
Ich verwende eine Kombination aus dem, was GeorgeW und mkprogramming vorgeschlagen haben:
quelle
Ich denke, irgendwie sind sie nicht so unterschiedlich, oder? Ha Ha ... nicht lustig. Wer hätte nicht gedacht, dass dies kein Problem ist? Hier ist die einfachste Lösung für Ihre Überlegungen. Übertragen Sie verschiedene Dateien auf Ihren Server und dann auf PhoneGap. Ich würde auch vorübergehend mit dem oben vorgeschlagenen http: check gehen.
Mein Interesse ist es, die Navigationsleiste des Browsers nach oben zu verschieben, sodass ich das Tag des isolierten Skripts einfach löschen und auf "Neu erstellen" [in DW] klicken kann (sie werden ohnehin für die Bereitstellung bereinigt, sodass dies eine dieser Aufgaben sein kann.) Wie auch immer Es ist eine gute Option (wenn man bedenkt, dass nicht viel anderes verfügbar ist), um Dinge mit isMobileBrowserAndNotPhoneGap effizient manuell zu kommentieren, wenn auf PG gedrückt wird. Wieder für mich in meiner Situation werde ich einfach das Tag für die (isolierte Code-) Datei löschen, die die Navigationsleiste nach oben drückt, wenn es sich um einen mobilen Browser handelt (es wird so viel schneller und kleiner sein). [Also ja, wenn Sie den Code für diese optimierte, aber manuelle Lösung isolieren können.]
quelle
Leicht modifiziert, funktioniert aber bei mir perfekt ohne Probleme.
Cordova soll nur auf einem eingebetteten Gerät und nicht auf einem Desktop geladen werden. Daher vermeide ich Cordova in einem Desktop-Browser vollständig. Das Testen und Entwickeln der Benutzeroberfläche und der MVVM ist dann sehr komfortabel.
Geben Sie diesen Code ein, z. in der Datei cordovaLoader.js
Anstatt Cordova Javascript selbst einzuschließen, schließen Sie auch cordovaLoader.js ein
Erleichtern Sie Ihre Arbeit! :) :)
quelle
quelle
Nur zur Information den Weg in PhoneGap 3.x Mobile Application Development Hotshot
und im YASMF-Rahmen
https://github.com/photokandyStudios/YASMF-Next/blob/master/lib/yasmf/util/core.js#L152
quelle
Ich habe es mit den Fensterobjekten versucht, aber es hat nicht funktioniert, als ich die Remote-URL im InAppBrowser geöffnet habe. Konnte es nicht schaffen. Der beste und einfachste Weg, dies zu erreichen, bestand darin, eine Zeichenfolge an die URL anzuhängen, die Sie über die Phonegap-App öffnen müssen. Überprüfen Sie dann, ob an den Dokumentspeicherort eine Zeichenfolge angehängt ist.
Sie werden sehen, dass der URL "#phonegap" eine Zeichenfolge hinzugefügt wird. Fügen Sie daher in der Domänen-URL das folgende Skript hinzu
quelle