2013-05-05 7 views
14

Ich habe eine App für iOS und Android entwickelt, die über den In-App-Browser (Webview) auf eine HTML-Datei von meinem Webserver zugreift.In-App-Browser (WebView) mit PHP/Javascript erkennen

Ich möchte nicht, dass ein Benutzer auf diese Datei zugreifen kann, ohne die App zu verwenden. Gibt es eine Möglichkeit zu erkennen, ob der Benutzer auf die Datei mit der App oder direkt über einen Browser auf diesem Smartphone/Tablet/Computer zugreift? Ich denke, dass eine Lösung mit PHP viel besser ist, weil Javascript ausgeschaltet werden kann. Zumindest Google Analytics kann zwischen Safari und Safari (In-App) unterscheiden. Es sollte mit jeder Version von iOS und Android funktionieren.

Danke für Ihre Hilfe.


Lösung

Nach vielen Versuchen fand ich endlich eine funktionierende Lösung für mich!

iOS: Sie können den Unterschied zwischen Safari und dem In-App-Browser mithilfe des Benutzeragenten erkennen. Wahrscheinlich gibt es eine bessere Lösung, aber es funktioniert.

// Safari (in-app) 
if ((strpos($_SERVER['HTTP_USER_AGENT'], 'Mobile/') !== false) && (strpos($_SERVER['HTTP_USER_AGENT'], 'Safari/') == false) { 
    echo 'Safari (in-app)'; 
} 

Android: Der Paketname aus der App in den PHP-Variablen $_SERVER['HTTP_X_REQUESTED_WITH'] gespeichert ist.

Wie Tim van Elsloo bereits bemerkt HTTP-Header können gefälscht werden und das ist nicht absolut sicher.

+0

Die iOs-Lösung schlägt fehl, wenn die Seite von anderen Browsern aus geöffnet wird. Nach ein paar Tests habe ich es ein wenig verfeinert. Überprüfen Sie hier: http: // Stackoverflow.com/questions/2738766/iphone-webapps-is-da-ein-weg-zu-erkennen-wie-es-war-geladen-home-screen-vs-safar/20757993 # 20757993 –

Antwort

5

Ich bin mir nicht sicher über Android, aber wenn Sie das iOS SDK UIWebView verwenden, sendet es den Namen und die Version Ihrer App als Teil des Benutzeragenten (YourApp/1.0).

Anschließend können Sie PHP verwenden, um zu überprüfen, ob Ihre In-App-Webansicht verwendet wird oder nicht:

if (strpos($_SERVER['HTTP_USER_AGENT'], 'YourApp/') !== false) 

Ich denke, Android macht etwas Ähnliches auch.

+1

Bitte beachten Sie, dass dies offensichtlich vorgetäuscht werden kann Auch durch einen Desktop-Browser (durch Setzen von "falschen" HTTP-Headern) sollten Sie sich aus Sicherheitsgründen nicht darauf verlassen. – elslooo

+2

Danke für Ihre schnelle Hilfe. Leider enthält der Benutzeragent den App-Namen nicht. Zumindest nicht bei meinen Versuchen. – ohh2ahh

+0

Verwenden Sie 'UIWebView'? Es sollte etwa so aussehen: ' /1.0 CFNetwork/459 Darwin/10.2.0'. Wenn es nicht (was ich bezweifle), dann könnten Sie versuchen, etwas wie http://stackoverflow.com/questions/478387/change-user-agent-in-uiwebview-iphone-sdk oder http: // stackoverflow zu tun. com/questions/8487581/uiwebview-ios5-changing-user-agent. – elslooo

1

Code Lösung:

$isWebView = false; 
if((strpos($_SERVER['HTTP_USER_AGENT'], 'Mobile/') !== false) && (strpos($_SERVER['HTTP_USER_AGENT'], 'Safari/') == false)) : 
    $isWebView = true; 
elseif(isset($_SERVER['HTTP_X_REQUESTED_WITH'])) : 
    $isWebView = true; 
endif; 

if(!$isWebView) : 
    // Android or iOS Webview 
else : 
    // Normal Browser 
endif; 
0

Für Android WebView finden den Link von Entwickler Chrome - https://developer.chrome.com/multidevice/user-agent#webview_user_agent

Es gibt bereits Hinweise in den User-Agent-String wie "Mobile", "wv" zur Verfügung.

können Sie so etwas wie

if (strpos($_SERVER['HTTP_USER_AGENT'], 'Mobile') !== false) 

oder

if (strpos($_SERVER['HTTP_USER_AGENT'], 'wv') !== false) 

zu erkennen, verwendet werden, wenn der Benutzer ein Android WebView ist.

Verwandte Themen