0

何時間もの調査と試行の後、コミュニティの助けを求めています。

最初に、私の英語が流暢ではないことをお詫びします。間違いがあるかもしれません。

アプリ内の Web ビューと Chrome ブラウザーで同じ機能を取得するのに問題があります。Webビューでうまく管理できないクロスドメインのトラブルについて考えています...

それがシナリオです:

私は異なる環境(統合、本番前、本番)を持っています。アプリにサインアップするための Web アドレスがあります。これは、Web アプリケーションを購入して管理されます (自分で管理するものではありません)。

Web アプリケーションには、サインアップ要求をサーバーに送信する JavaScript があります。環境によっては、webapp ページとサーバーが同じドメインにありません。

統合環境にいるとき、webapp はサーバーと同じドメインにあります。私が他の環境にいるとき、webapp はサーバーと同じドメインではありません。

Chromeブラウザでサインアップしてみると、全く問題なく、どの環境でもサインアップできています。

webview を使用している場合、環境によってはサインアップできません。

WebView にローカル ファイルをロードします。このローカル html ファイルには、環境に応じて src タグを持つ iframe が含まれています。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

私の問題を理解していただければ幸いです。

4

1 に答える 1

0

私の英語もすみません。

これを追加して、SSL エラーを無視してみてください

@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
    handler.proceed(); // Ignore SSL certificate errors
}

new WebViewClient()

htmlページのコードをいくつか与えたほうがいいです、魔女が使ったXMLHttpRequest

于 2013-10-16T10:14:42.903 に答える