5
votes

Les iframes peuvent-ils fonctionner dans WKWebView avec Cordova?

Selon le blog Apache Cordova, les iframes peuvent ne pas fonctionner avec WKWebView. ( https://cordova.apache.org/ news / 2018/08/01 / future-cordova-ios-webview.html )

J'ai une application Cordova qui se trouve dans l'App Store et qui repose assez largement sur les iframes. Étant donné que UIWebView est susceptible d'être supprimé dans iOS 13, existe-t-il un moyen de faire fonctionner les iframes à l'aide de WKWebView?

Voici ce que j'ai fait jusqu'à présent:

J'ai essayé d'utiliser le plugin Ionic WebView ( https://github.com/ ionic-team / cordova-plugin-ionic-webview ), et bien que cela fonctionne pour certaines parties de mon application, cela ne fonctionne pas sur les pages iframe. Plus précisément, j'obtiens que l'en-tête Access-Control-Allow-Origin contient la valeur non valide «null». Je n'obtiens pas cette erreur en utilisant UIWebView.


2 commentaires

Avez-vous résolu ce problème?


Malheureusement, je n'ai pas pu résoudre ce problème. En discutant avec la communauté de Cordova, ils ont suggéré d'écrire les pages iframed de manière native. Nous avons décidé de réécrire l'application à l'aide de Xamarin.


3 Réponses :


1
votes

Ajoutez ceci à votre Cordova config.xml

<allow-navigation href="http://*.yourdomain.com/*" />

Cela permettra à vos pages HTML, quels que soient les documents racine ou les enfants de l'iframe, de rediriger de l'hôte local vers une URL distante. p>


0 commentaires

0
votes

Ajoutez ceci dans votre config.xml

<allow-navigation href="*" />

Puis créez votre plate-forme iOS


0 commentaires

0
votes

J'ai rencontré ce problème également dans mes applications Cordova et j'ai trouvé une solution de contournement. Cela implique d'écrire du contenu directement dans l'iframe, plutôt que de lui donner un src = "...". De cette façon, iframe fonctionne avec la même origine que le parent.

(Les iframes fonctionnent dans WkWebView; c'est juste que tout ce qui est chargé via src = "file: // ..." [par exemple tout local app files] sont traités comme une origine unique, donc a tendance à bousiller tout JavaScript cross-frame.)

function frameEl_injectHtml(frameEl, injectHtml) {
    // frameEl must exist in DOM before its contentWindow is accessible.
    if (!frameEl.contentWindow) { alert("frameInjectHtml() but frameEl not (yet or anymore) in DOM."); return; }

    frameEl.contentWindow.document.open('text/htmlreplace');
    frameEl.contentWindow.document.write(injectHtml);
    frameEl.contentWindow.document.close();
}

// Create <frame>, insert into DOM, and inject content.
var frameHtml = "<html><head></head>" +
    "<body>" +
        "iframe body" +
        "<script>window.parent.alert('iframe even same-origin as parent.');</script>" +
    "</body></html>";
var frameEl = document.createElement('iframe');
frameEl.src = "about:blank";
document.body.appendChild(frameEl);
frameEl_injectHtml(frameEl, frameHtml);


0 commentaires