Android管理我的webview组件,如chrome(跨域问题)
经过数小时的研究和尝试,我正在寻求社区的帮助 首先,对不起,我的英语不流利,所以你会发现一些错误 我很难在我的应用内webview和chrome浏览器上获得相同的组件。我正在考虑在我的web视图中没有很好地管理跨域问题 情况就是这样: 我有不同的环境(集成、试生产、生产)。 我有一个网址可以注册我的应用程序。这是通过购买web应用程序来管理的(不是我自己管理的) webapp有一个javascript将注册请求发送到服务器。根据环境的不同,webapp页面和服务器不在同一个域中 当我在集成环境中时,webapp与服务器位于同一个域中。 当我在其他环境中时,webapp与服务器不在同一个域中 当我尝试使用chrome浏览器注册时,完全没有问题,我可以在任何环境下注册 当我使用webview时,根据我的环境,我无法注册 我在webview中加载一个本地文件。这个本地html文件包含一个iframe,它的src标记取决于环境。 如果src和服务器在同一个域中,那么一切都会正常进行。 如果没有,就有麻烦了 问题不是来自服务器,因为我可以在Chrome的每个环境中注册。 因此,我想知道如何管理我的webview,使其具有与chrome相同的组件,并使注册在每个环境中都能正常工作 我试图在myWebView.load(url)中直接加载webapp的url,但它没有改变任何内容 这是我的密码:Android管理我的webview组件,如chrome(跨域问题),android,google-chrome,webview,cross-domain,Android,Google Chrome,Webview,Cross Domain,经过数小时的研究和尝试,我正在寻求社区的帮助 首先,对不起,我的英语不流利,所以你会发现一些错误 我很难在我的应用内webview和chrome浏览器上获得相同的组件。我正在考虑在我的web视图中没有很好地管理跨域问题 情况就是这样: 我有不同的环境(集成、试生产、生产)。 我有一个网址可以注册我的应用程序。这是通过购买web应用程序来管理的(不是我自己管理的) webapp有一个javascript将注册请求发送到服务器。根据环境的不同,webapp页面和服务器不在同一个域中 当我在集成环境中
package com.something.fr;
import org.json.JSONException;
import org.json.JSONObject;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.util.Log;
import android.webkit.CookieManager;
import android.webkit.JavascriptInterface;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.ProgressBar;
import android.widget.Toast;
public class SimpleWebviewActivity extends FragmentActivity {
private static final String TAG = SimpleWebviewActivity.class.getName();
public static final String URL_KEY = "URL_KEY";
private static final String CODE_KEY = "code";
private static final String OPENING_SUCCESSFUL = "OpeningSuccessful";
private ProgressBar mPbar;
private WebView mWv;
private String mUrl;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Bundle b = getIntent().getExtras();
if(b != null) {
mUrl = b.getString(URL_KEY);
}
setContentView(R.layout.web_register_activity_layout);
mPbar = (ProgressBar) findViewById(R.id.web_register_progress_bar);
mWv = (WebView) findViewById(R.id.web_register_webview);
}
@Override
protected void onResume() {
super.onResume();
WebSettings settings = mWv.getSettings();
settings.setJavaScriptEnabled(true);
settings.setAllowFileAccessFromFileURLs(true);
settings.setAllowUniversalAccessFromFileURLs(true);
settings.setAppCacheEnabled(true);
settings.setDatabaseEnabled(true);
settings.setDomStorageEnabled(true);
mWv.setWebChromeClient(new WebChromeClient() {
public void onProgressChanged(WebView view, int progress)
{
mPbar.setVisibility(ProgressBar.VISIBLE);
mPbar.setProgress(progress);
if(progress == 100)
mPbar.setVisibility(ProgressBar.GONE);
}
});
mWv.setWebViewClient(new WebViewClient() {
@Override
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl)
{
// Handle the error
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url)
{
return false;
}
});
mWv.addJavascriptInterface(new WebAppInterface(this), "AndroidDelegate");
if (mUrl != null && !mUrl.isEmpty()) {
mWv.loadUrl(mUrl);
}else {
Toast.makeText(getApplicationContext(), R.string.no_url_to_load, Toast.LENGTH_SHORT).show();
finish();
}
}
public class WebAppInterface {
Context mContext;
/** Instantiate the interface and set the context */
WebAppInterface(Context c) {
mContext = c;
}
/** Show a toast from the web page */
@JavascriptInterface
public void handlePostMessage(String jsonMsg) {
JSONObject postMsgJSON = null;
try {
postMsgJSON = new JSONObject(jsonMsg);
String code = postMsgJSON.getString(CODE_KEY);
Log.d(TAG, "create account response " + code);
if (code.contentEquals(OPENING_SUCCESSFUL)) {
Intent intent = new Intent(getApplicationContext(), Login.class);
startActivity(intent);
finish();
}
} catch (JSONException e) {
Log.e(TAG,"error parsing json from postmessage : " + jsonMsg);
Log.e(TAG, "", e);
}
}
}
}
以下是从webconsole获取的日志:
10-08 21:07:06.975: E/Web Console(10259): XMLHttpRequest cannot load https://www.name_of_the_server_domain.fr/services/compte/ouvrir. Request header field Content-Type is not allowed by Access-Control-Allow-Headers.:1
10-08 21:07:07.020: W/Web Console(10259): Error for [create]@[https://www.name_of_the_server_domain.fr/services/compte/ouvrir] response : {"readyState":0,"responseText":"","status":0,"statusText":"error"}:9
我希望你能理解我的问题,并希望你能帮助我。我的英语也很抱歉 尝试添加此选项以忽略SSL错误
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
handler.proceed(); // Ignore SSL certificate errors
}
到新建WebViewClient()
如果您提供一些html页面的代码,这会更好,因为它使用了
XMLHttpRequest
谢谢,我将尝试这个解决方案。我无法从html页面提供任何代码,因为我无法管理它。这是由另一个团队完成的。Malheureusement可以是一个非加性的团队