Android管理我的webview组件,如chrome(跨域问题)

Android管理我的webview组件,如chrome(跨域问题),android,google-chrome,webview,cross-domain,Android,Google Chrome,Webview,Cross Domain,经过数小时的研究和尝试,我正在寻求社区的帮助 首先,对不起,我的英语不流利,所以你会发现一些错误 我很难在我的应用内webview和chrome浏览器上获得相同的组件。我正在考虑在我的web视图中没有很好地管理跨域问题 情况就是这样: 我有不同的环境(集成、试生产、生产)。 我有一个网址可以注册我的应用程序。这是通过购买web应用程序来管理的(不是我自己管理的) webapp有一个javascript将注册请求发送到服务器。根据环境的不同,webapp页面和服务器不在同一个域中 当我在集成环境中

经过数小时的研究和尝试,我正在寻求社区的帮助

首先,对不起,我的英语不流利,所以你会发现一些错误

我很难在我的应用内webview和chrome浏览器上获得相同的组件。我正在考虑在我的web视图中没有很好地管理跨域问题

情况就是这样:

我有不同的环境(集成、试生产、生产)。 我有一个网址可以注册我的应用程序。这是通过购买web应用程序来管理的(不是我自己管理的)

webapp有一个javascript将注册请求发送到服务器。根据环境的不同,webapp页面和服务器不在同一个域中

当我在集成环境中时,webapp与服务器位于同一个域中。 当我在其他环境中时,webapp与服务器不在同一个域中

当我尝试使用chrome浏览器注册时,完全没有问题,我可以在任何环境下注册

当我使用webview时,根据我的环境,我无法注册

我在webview中加载一个本地文件。这个本地html文件包含一个iframe,它的src标记取决于环境。 如果src和服务器在同一个域中,那么一切都会正常进行。 如果没有,就有麻烦了

问题不是来自服务器,因为我可以在Chrome的每个环境中注册。 因此,我想知道如何管理我的webview,使其具有与chrome相同的组件,并使注册在每个环境中都能正常工作

我试图在myWebView.load(url)中直接加载webapp的url,但它没有改变任何内容

这是我的密码:

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可以是一个非加性的团队