37 votes

WebView sur Android ICS, problèmes d’iframe avec android_assets

Mon moteur de l'application s'exécute à l'intérieur d'une WebView. Il s'étend sur différents IFRAMES. L'application principale html et le iframes html sont sur android_assets. Sur Android 3.x pas de problèmes jamais. Même sur le navigateur google chrome, etc.

Si je créer une IFRAME (createElement -> appendChild) l'iframe est créé.

Lorsque je charge des choses (iframe.src="url" <> iframe.contentWindow.emplacement.href="url") ... IL REMPLACE L'APPLICATION PRINCIPALE!! (au lieu de chargement en iframe)

Déjà essayé:

  • de la fenêtre.setTimeout retarder le chargement... a échoué.
  • dans webview, injecter X-Frame-Options=SAME_ORIGIN comme en-tête dans tout chargement de la page -> échec
  • la création de l'iframe, réglage de la sandbox=same_origin,allow_scripts -> échec

Quelqu'un avec des problèmes similaires? Ou quelqu'un peut-il m'aider à trouver de la documentation sur WebView ICS bugs vs en Nid d'abeille?

Également trouvé de nombreux autres étranges questions... ICS est vraiment ce buggy? :S :S

2voto

Alexandre Almeida Points 37

Messieurs, j'ai eu le même problème lors de l'utilisation de Phonegap (Apache Cordova) et IFrames Android (Ice Cream Sandwich 4.0.3).

Pour résoudre ce problème, j'ai dû modifier Apache Cordova Code Source. J'ai changé le org.apache.cordoue.CordovaWebViewClient.java fichier, et a commenté cette partie du code, et inclus la dernière ligne (return false;).

De sorte qu'il ressemble maintenant à ceci:

    // All else
    //        else {
    //
    //            // If our app or file:, then load into a new Cordova webview container by starting a new instance of our activity.
    //            // Our app continues to run.  When BACK is pressed, our app is redisplayed.
    //            if (url.startsWith("file://") || url.indexOf(this.ctx.baseUrl) == 0 || ctx.isUrlWhiteListed(url)) {
    //                this.ctx.loadUrl(url);
    //            }
    //
    //            // If not our application, let default viewer handle
    //            else {
    //                try {
    //                    Intent intent = new Intent(Intent.ACTION_VIEW);
    //                    intent.setData(Uri.parse(url));
    //                    ctx.startActivity(intent);
    //                } catch (android.content.ActivityNotFoundException e) {
    //                    LOG.e(TAG, "Error loading url "+url, e);
    //                }
    //            }
    //        }
    //        return true;
    return false;

Ce problème se produit uniquement sur Android ICS, mais j'ai changé le code pour toutes mes applications. Je suis encore en train de faire des tests.

Dans mon analyse, il semble que lorsque vous essayez de charger une page dans un iFrame, la WebView Android sur ICS interprète comme une nouvelle demande de page, et IL REMPLACE L'APPLICATION PRINCIPALE!!, ou en d'autres termes, il OUVRE la page demandée dans le trou de la fenêtre parent.

J'ai laissé le reste du code intact.

J'espère que cela aide, comme il l'a fait pour moi.

En ce qui concerne meilleur.

Alexandre Almeida

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X