8

ASP.NET MVC Web アプリケーションと対話する Android Phonegap/Cordova アプリがあります。Web ページがブラウザからロードされているかどうか、または Phonegap/Cordova アプリからロードされているかどうかにかかわらず、サーバー側を検出しようとしています。

私が検討したいくつかの方法があります:

  1. ユーザー エージェント文字列を変更します。それを機能させる方法を説明するこのstackoverflowリンクを見つけました。残念ながら、私にはうまくいきませんでした。リクエスト オブジェクトにカスタム ユーザー エージェント文字列がありませんでした。
  2. カスタム ヘッダー値を含めます。これは、cordova ライブラリを変更することで実行できます (このスタックオーバーフロー リンクを参照してください)。ただし、ライブラリの変更は、将来メンテナンスの問題になるため、通常はお勧めできません。(更新: 最初のリクエストの後、このメソッドは機能しませんでした。)
  3. 最初のページをロードするときに、クエリ文字列に何か特別なものを追加します。その後、Cookie を設定できます。これは、単純なヘッダーの変更と比較して、一種の醜い解決策です。

ユーザー エージェント文字列の変更に何か問題がありますか? または、これを達成する別の方法はありますか?

4

4 に答える 4

5

そのため、Cordova 5.1.1 とそのプラットフォーム バージョンの Android 4.0.2 (Cordova 5.1.1 を使用しているときにすぐに使用できるもの) の場合、これらの回答は無効になります。

いくつかの困難な調査の後、上記のバージョンのソリューションは次のようになりました。

MainActivity.javacordova によってデフォルトで作成され、 extends である通常のメソッドでは、次のメソッドCordovaActivityをオーバーライドします。makeWebViewEngine

@Override
    protected CordovaWebViewEngine makeWebViewEngine() {
        CordovaWebViewEngine cordovaWebViewEngine = super.makeWebViewEngine();
        WebSettings settings = ((SystemWebView) ((SystemWebViewEngine) cordovaWebViewEngine).getView()).getSettings();
        settings.setUserAgentString("MreaderMobile App / Android");
        return cordovaWebViewEngine;
    }

将来、彼らが Android プラットフォームのバージョンをアップグレードするとき、これは config.xml を介してより簡単に行う必要がありますが、バグ修正スレッド CB-8960 についてコメントしたように、オプションの ATM ではありません。

于 2015-07-14T11:53:30.073 に答える
4

似たようなプル リクエストがあるようです (「cordova/phonegap」を UAS に追加)
https://github.com/apache/cordova-android/pull/10

ここが肝心です。

したがって、DroidGap を拡張し、public void init(CordovaWebView webView, CordovaWebViewClient webViewClient, CordovaChromeClient webChromeClient)をオーバーライドします。

...
WebSettings settings = this.appView.getSettings();
String userAgent = settings.getUserAgentString();
// can append or redefine here
userAgent += " PhoneGap/Cordova";
settings.setUserAgentString(userAgent);
...

次に、拡張された DroidGap を使用して、ユーザー エージェント文字列の定義方法を制御できます。

これが機能することを確認しました。現在の Cordova 実装を使用した完全なコードは次のとおりです。

package com.focusatwill.androidApp;

import org.apache.cordova.CordovaChromeClient;
import org.apache.cordova.CordovaWebView;
import org.apache.cordova.CordovaWebViewClient;
import org.apache.cordova.DroidGap;
import org.apache.cordova.api.LOG;

import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.WebSettings;
import android.widget.LinearLayout;


public class DroidGapCustom extends DroidGap {

    /**
     * Initialize web container with web view objects.
     *
     * @param webView
     * @param webViewClient
     * @param webChromeClient
     */
    public void init(CordovaWebView webView, CordovaWebViewClient webViewClient, CordovaChromeClient webChromeClient) {
        LOG.d("EVENT", "Custom DroidGap.init()");

        // Set up web container
        this.appView = webView;

        // Custom addition of user agent string
        WebSettings settings = this.appView.getSettings();
        String userAgent = settings.getUserAgentString();
        // can append or redefine here
        userAgent += " PhoneGap/Cordova";
        settings.setUserAgentString(userAgent);

        this.appView.setId(100);

        this.appView.setWebViewClient(webViewClient);
        this.appView.setWebChromeClient(webChromeClient);
        webViewClient.setWebView(this.appView);
        webChromeClient.setWebView(this.appView);

        this.appView.setLayoutParams(new LinearLayout.LayoutParams(
                ViewGroup.LayoutParams.MATCH_PARENT,
                ViewGroup.LayoutParams.MATCH_PARENT,
                1.0F));

        // Add web view but make it invisible while loading URL
        this.appView.setVisibility(View.INVISIBLE);
        this.root.addView(this.appView);
        setContentView(this.root);

        // Clear cancel flag
        this.cancelLoadUrl = false;
    }

}
于 2013-02-08T18:38:56.430 に答える
2

@Peterの答えはそこにありますが、initメソッド全体をオーバーライドする必要はありません。これは、より簡単で保守しやすい方法です。

    /***
     * This adds an actually useful user-agent string to the WebView.
     */
    @Override
    protected CordovaWebView makeWebView() {
        CordovaWebView wv = super.makeWebView();

        WebSettings settings = wv.getSettings();            
        String userAgent = settings.getUserAgentString();

        // can append or redefine here
        userAgent += " PhoneGap/Cordova Android";
        settings.setUserAgentString(userAgent);

        return wv;
    }
于 2014-09-11T06:40:28.020 に答える
1

最近のバージョンの cordova を使用している場合は、サイトで次の構成ガイドを確認してください: http://cordova.apache.org/docs/en/dev/config_ref/index.html#Android%20Configuration

ユーザーエージェントを検索します。User-Agent に何かを追加する (AppendUserAgent 設定) か、User-Agent をオーバーライドする (OverrideUserAgent 設定) ことができる 2 つの設定があります。

たとえば、私のAndroidプロジェクトでは、ファイル res/xml/config.xml に設定を追加しました

<preference name="AppendUserAgent" value=" [this is from my hybrid app]" />

これを適用すると、User-Agent は次のように変更されます。

Mozilla/5.0 (Linux; Android 5.0; SM-N9005 Build/LRX21V; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/51.0.2704.81 Mobile Safari/537.36 [this is from my hybrid app]
于 2016-06-30T08:56:20.180 に答える