web-dev-qa-db-ja.com

PHP / JavaScriptを使用してアプリ内ブラウザ(WebView)を検出する

私はiOS用のアプリを開発し、Android=これはアプリ内ブラウザー(Webview)を使用してWebサーバーからHTMLファイルにアクセスします。

ユーザーがアプリを使用せずにこのファイルにアクセスできないようにしたい。ユーザーがアプリを使用して、またはこのスマートフォン/タブレット/コンピューターのブラウザーを介して直接ファイルにアクセスしている場合、検出する可能性はありますか? PHP=のソリューションは、JavaScriptをオフにできるため、はるかに優れていると思います。少なくともGoogle Analyticsは、SafariとSafari(アプリ内)を区別できます。すべてのバージョンのバージョンで動作するはずです。 iOSおよびAndroid。

ご協力いただきありがとうございます。


ソリューション

多くの試みの後、私は最終的に私のための実用的な解決策を見つけました!

iOS:ユーザーエージェントを使用して、Safariとアプリ内ブラウザの違いを検出できます。おそらくより良い解決策がありますが、それはうまくいきます。

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

Android:アプリのパッケージ名は、PHP変数$_SERVER['HTTP_X_REQUESTED_WITH']

// Android (in-app)
if($_SERVER['HTTP_X_REQUESTED_WITH'] == "com.company.app") {
    echo 'Android (in-app)';
}

Tim van Elslooがすでに指摘したように、HTTPヘッダーは偽造される可能性があり、これは完全に安全ではありません。

18
ohh2ahh

Androidについてはわかりませんが、iOS SDKのUIWebViewを使用している場合は、ユーザーエージェントの一部としてアプリの名前とバージョンを送信します(YourApp/1.0)。

次に、PHPを使用して、アプリ内Webビューが使用されているかどうかを確認できます。

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

Androidも同様のことを行います。

5
elslooo

ソリューションコード:

$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;
6
Alex Baur

Android WebViewについては、Developer Chrome- https://developer.chrome.com/multidevice/user-agent#webview_user_agent

「モバイル」、「wv」などのユーザーエージェント文字列には、すでに使用可能なヒントがあります。

あなたは次のようなものを使うかもしれません

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

または

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

ユーザーがAndroid WebView。

0
Mallikarjun M