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

Dan*_*ion 8 user-agent android http-headers cordova

我有一个Android Phonegap/Cordova应用程序,它与ASP.NET MVC Web应用程序交互.我试图检测服务器端是否从浏览器或我的Phonegap/Cordova应用程序加载网页.

我考虑过几种方法:

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

我在用户代理字符串更改时做错了吗?或者有另一种方法可以实现这一目标吗?

Joã*_*nes 5

因此,对于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;
    }
Run Code Online (Sandbox Code Playgroud)

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


Pet*_*tai 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);
...
Run Code Online (Sandbox Code Playgroud)

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

}
Run Code Online (Sandbox Code Playgroud)