8

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

我考虑过几种方法:

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

我在用户代理字符串更改上做错了吗?还是有另一种方法可以做到这一点?

4

4 回答 4

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

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

于 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

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

例如,在我的 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 回答