Строка пользовательского агента или заголовок без изменения библиотек Cordova

У меня есть приложение Android Phonegap/Cordova, которое взаимодействует с веб-приложением ASP.NET MVC. Я пытаюсь определить на стороне сервера, загружается ли веб-страница из браузера или из моего приложения Phonegap/Cordova.

Есть несколько методов, которые я рассмотрел:

  1. Измените строку пользовательского агента. Я нашел эту ссылку stackoverflow, которая описывает способ заставить это работать. К сожалению, это не сработало для меня. В объекте запроса не было пользовательской строки пользовательского агента.
  2. Включите пользовательское значение заголовка. Это можно сделать, изменив библиотеку Cordova (см. android-app">эта ссылка на stackoverflow.) Однако изменение библиотек обычно является плохой идеей, поскольку в будущем это станет проблемой обслуживания. (Обновление: этот метод не работал после первого запроса.)
  3. Добавьте что-то особенное в строку запроса при загрузке первой страницы. Затем можно установить файл cookie. Это довольно уродливое решение по сравнению с простым изменением заголовка.

Я делаю что-то неправильно при изменении строки пользовательского агента? Или есть другой метод, который мог бы это сделать?


person Danation    schedule 29.01.2013    source источник


Ответы (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;
    }

}
person Peter Ajtai    schedule 08.02.2013
comment
Я знаю, что это старо, но я получаю 404 ошибки на большинстве ссылок Github. - person Wally; 07.12.2015
comment
@Wally выглядит так, потому что DroidGap устарел: github. ком/апач/кордова-андроид/ - person Peter Ajtai; 08.12.2015

Итак, для 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.

person João Antunes    schedule 14.07.2015

Ответ @Peter попадает туда, но вам не нужно переопределять весь метод инициализации. Вот более простой и удобный способ:

    /***
     * 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;
    }
person phreakhead    schedule 11.09.2014
comment
Этот метод работает и определенно кажется более удобным для сопровождения, однако я хотел бы отметить, что вы должны добавить import android.webkit.WebSettings;, поскольку Cordova не добавляет его по умолчанию в CordovaApp.java. - person fskirschbaum; 04.02.2015

Если вы используете последнюю версию 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]
person Victor Ionescu    schedule 30.06.2016