我有一个与ASP.NET MVC Web应用程序交互的Android Phonegap / Cordova应用程序。我正在尝试检测服务器端,无论是从浏览器还是从我的Phonegap / Cordova应用程序加载网页。
我考虑过几种方法:
我是否在用户代理字符串更改时出错了?或者是否有其他方法可以实现这一目标?
答案 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]