自定义用户代理字符串或标头,无需修改cordova库

时间:2013-01-29 01:32:21

标签: android cordova http-headers user-agent

我有一个与ASP.NET MVC Web应用程序交互的Android Phonegap / Cordova应用程序。我正在尝试检测服务器端,无论是从浏览器还是从我的Phonegap / Cordova应用程序加载网页。

我考虑过几种方法:

  1. 更改用户代理字符串。我发现this stackoverflow link描述了实现这一目标的方法。不幸的是,它对我不起作用。请求对象没有自定义用户代理字符串。
  2. 包含自定义标头值。这可以通过修改cordova库来完成(参见this stackoverflow link。)但是,修改库通常是一个坏主意,因为它将来会成为一个维护问题。 (更新:此方法在第一次请求后无效。)
  3. 加载第一页时,在查询字符串中添加一些特殊内容。然后可以设置cookie。与简单的标题更改相比,这是一种丑陋的解决方案。
  4. 我是否在用户代理字符串更改时出错了?或者是否有其他方法可以实现这一目标?

4 个答案:

答案 0 :(得分:5)

因此,对于Cordova 5.1.1及其平台版Android 4.0.2(我目前在使用Cordova 5.1.1时开箱即用),这些答案已不再有效。

经过一些艰难的探索之后,上述版本的解决方案如下:

在cordova默认创建并延伸CordovaActivity的常用makeWebViewEngine中,覆盖@Override protected CordovaWebViewEngine makeWebViewEngine() { CordovaWebViewEngine cordovaWebViewEngine = super.makeWebViewEngine(); WebSettings settings = ((SystemWebView) ((SystemWebViewEngine) cordovaWebViewEngine).getView()).getSettings(); settings.setUserAgentString("MreaderMobile App / Android"); return cordovaWebViewEngine; } 方法:

{
    "resultFlag": false,
    "message": "Dealer not found",
    "info": []
}

将来,当他们升级Android平台的版本时,这应该通过config.xml更容易完成,但它不是ATM的选项,因为我评论了错误修正线程CB-8960

答案 1 :(得分:4)

看起来有类似的拉动请求(将“cordova / phonegap”添加到UAS)
https://github.com/apache/cordova-android/pull/10

Here是它的核心。

所以我会扩展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;
    }

}

答案 2 :(得分: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;
    }

答案 3 :(得分:1)

如果您使用的是最新版本的cordova,请在其网站上查看此配置指南: http://cordova.apache.org/docs/en/dev/config_ref/index.html#Android%20Configuration

搜索UserAgent。有2个设置允许您将某些内容附加到User-Agent(AppendUserAgent设置)或覆盖User-Agent(OverrideUserAgent设置)。

例如,在我的android项目中,在文件res / xml / config.xml中我添加了设置

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

应用此功能后,我的用户代理将更改为:

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]