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

Android 自定义用户代理字符串或标头,无需修改cordova libs,android,cordova,http-headers,user-agent,Android,Cordova,Http Headers,User Agent,我有一个Android Phonegap/Cordova应用程序,可以与ASP.NET MVC web应用程序交互。我正在尝试检测服务器端是否从浏览器或Phonegap/Cordova应用程序加载网页 我考虑过几种方法: 更改用户代理字符串。我发现这描述了一种实现这一目标的方法。不幸的是,它对我不起作用。请求对象没有自定义用户代理字符串 包括自定义标题值。这可以通过修改cordova库来实现(请参阅)。不过,修改库通常是个坏主意,因为它在将来会成为维护问题。(更新:第一次请求后,此方法不起作用。

我有一个Android Phonegap/Cordova应用程序,可以与ASP.NET MVC web应用程序交互。我正在尝试检测服务器端是否从浏览器或Phonegap/Cordova应用程序加载网页

我考虑过几种方法:

  • 更改用户代理字符串。我发现这描述了一种实现这一目标的方法。不幸的是,它对我不起作用。请求对象没有自定义用户代理字符串
  • 包括自定义标题值。这可以通过修改cordova库来实现(请参阅)。不过,修改库通常是个坏主意,因为它在将来会成为维护问题。(更新:第一次请求后,此方法不起作用。)
  • 加载第一页时,向查询字符串添加一些特殊内容。然后就可以设置一个cookie。与简单的标题更改相比,这是一种丑陋的解决方案

  • 我是否在用户代理字符串更改上出错?或者有其他方法可以实现这一点吗?

    看起来有类似的请求(将“cordova/phonegap”添加到UAS)

    这是它的核心

    因此,我将扩展DroidGap并覆盖:

    然后,您可以使用扩展的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;
        }
    
    }
    

    @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;
        }
    

    因此,对于Cordova 5.1.1及其Android 4.0.2平台版本(我目前在使用Cordova 5.1.1时从盒子里取出的东西),这些答案不再有效

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

    在通常的
    MainActivity.java
    中,由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;
        }
    

    将来,当他们升级Android平台版本时,通过config.xml应该更容易完成,但这不是ATM选项,正如我在错误修复线程CB-8960上所评论的那样。如果您使用的是最新版本的cordova,请在他们的网站上查看此配置指南:

    搜索用户代理。有两种设置允许您将某些内容附加到用户代理(AppendUserAgent设置)或重写用户代理(OverrideUserAgent设置)

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

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

    这种方法有效,而且看起来更易于维护,但是,我想指出的是,您必须添加
    import android.webkit.WebSettings因为Cordova默认情况下没有将其添加到CordovaApp.java中。我知道这很旧,但大多数Github链接上都出现404个错误。@Wally看起来像是因为DroidGap被降级了:
    
    <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]