3

Android を多用しWebViewてカスタム HTML コンテンツを表示するアプリがあります。最新の Android アップデート (4.4/Kit-Kat/SDK-19) では、再設計されWebViewた .

Nexus 5 を使用しているユーザーの 1 人が、一部のリンクが原因でアプリがクラッシュするという問題を報告しました。4.4 エミュレーターで実行し、WebViewClientshouldOverrideUrlLoading()メソッドにデバッグしました。以前にテストされたすべての Android バージョン (2.2-4.3) ではString、メソッドに渡された URL に「/」文字を含むカスタム URL が含まれていました。4.4 では、まったく同じリンクの代わりに「\」文字が含まれるようになりました。

これは私には意味がありません。私はHTMLをまったく同じようにロードするので、どういうわけか、新しいWebViewものはすべてのスラッシュをバックスラッシュに変換しました.

なぜ新しいものWebViewはこれを行うのですか?

4

4 に答える 4

1

さらにデバッグを行ったところ、実際に質問が逆になっていることがわかりました。新しいものではなく、古いバージョンの のWebView変換が行われたことが判明しましたURL

これに似た形式の HTML を次のようにロードしますWebView

    <a href="this\\is\\my\\custom\\path">link</a>

二重のバック スラッシュを区切り記号として使用し、後でリンクがクリックされたときにデータを解析します。古いバージョンではWebView、ダブル バックスラッシュ文字がスラッシュに変換されていました。そのコードに参加してから長い時間が経ち、元の HTML のバックスラッシュではなくスラッシュを使用するようにコードを調整したことを忘れていました。

の新しいバージョンでWebViewは、カスタムがURLそのまま残り、元の HTML とまったく同じ文字列が得られます。したがってWebView、新しい問題ではなく、古い問題であることがわかります。

于 2013-11-11T18:51:55.690 に答える
1

新しい WebView は、リソースを要求し、カスタム URL スキームを使用するリンクを解決するときに、追加の制限を適用します。たとえば、shouldOverrideUrlLoading() や shouldInterceptRequest() などのコールバックを実装すると、WebView は有効な URL に対してのみコールバックを呼び出します。

カスタム URL スキームまたはベース URL を使用していて、Android 4.4 でアプリがこれらのコールバックの呼び出しをあまり受けていない、またはリソースの読み込みに失敗していることに気付いた場合は、RFC 3986 に準拠した有効な URL がリクエストで指定されていることを確認してください。

たとえば、新しい WebView は、次のようなリンクに対して shouldOverrideUrlLoading() メソッドを呼び出さない場合があります。

プロファイルを表示 ユーザーがこのようなリンクをクリックした結果は、次のように異なる場合があります。

無効または null のベース URL を指定して loadData() または loadDataWithBaseURL() を呼び出してページをロードした場合、ページ上のこのタイプのリンクに対する shouldOverrideUrlLoading() コールバックを受け取りません。注: loadDataWithBaseURL() を使用し、ベース URL が無効であるか null に設定されている場合、ロードするコンテンツ内のすべてのリンクは絶対でなければなりません。

loadUrl() を呼び出してページをロードした場合、または loadDataWithBaseURL() を使用して有効なベース URL を提供した場合、ページ上のこのタイプのリンクに対して shouldOverrideUrlLoading() コールバックを受け取りますが、受け取る URL は、現在のページ。たとえば、受け取る URL は「showProfile」ではなく「 http://www.example.com/showProfile 」になります。上記のようにリンクで単純な文字列を使用する代わりに、次のようなカスタム スキームを使用できます。

<a href="example-app:showProfile">Show Profile</a>

次に、この URL を shouldOverrideUrlLoading() メソッドで次のように処理できます。

// The URL scheme should be non-hierarchical (no trailing slashes)
  private static final String APP_SCHEME = "example-app:";

@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
    if (url.startsWith(APP_SCHEME)) {
        urlData = URLDecoder.decode(url.substring(APP_SCHEME.length()), "UTF-8");
       respondToData(urlData);
        return true;
    }
    return false;
}

HTML を変更できない場合は、loadDataWithBaseURL() を使用して、「example-app:///」などのカスタム スキームと有効なホストで構成されるベース URL を設定できる場合があります。例えば:

webView.loadDataWithBaseURL("example-app://example.co.uk/", HTML_DATA,
    null, "UTF-8", null);

有効なホスト名は RFC 3986 に準拠する必要があり、末尾にスラッシュを含めることが重要です。そうしないと、読み込まれたページからのリクエストがドロップされる可能性があります。

于 2016-04-14T07:55:51.270 に答える