3 votes

javascript intégré dans le html ne fonctionne pas dans wkwebview

Je suis en train d'implémenter wkwebview dans une application qui utilisait UIWebView. Je ne parviens pas à faire exécuter le javascript lorsqu'on pointe vers un fichier html local qui contient le javascript. Le javascript est dépouillé pour faire une simple alerte et charger une carte google basique. Rien de tout cela n'est exécuté. Dois-je utiliser un serveur local ? GCDWebserver

Je dois ajouter que le html/javascript fonctionne dans safari, le navigateur google sans problème.

Les solutions proposées comprennent 1. AppTransportSecuritySettings AllowArbitrary loads. 2. ViewController.swift webview.configuration.preferences.javaScriptEnabled = true 3. Cette question aborde le problème et indique qu'il a été corrigé dans iOS 10.3. Charger des fichiers Javascript à travers un fichier HTML sur WKWebView dans iOS Le simulateur fonctionne sous la version 12.1 4. Cette question aborde également le problème de la nécessité pour GCDWebserver d'être capable d'exécuter du javascript à l'aide de wkwebview. WKWebView n'exécute pas de code js Ce problème a toutefois été résolu dans une version plus récente d'iOS. Voici un peu de code :

import UIKit
import WebKit
class ViewController: UIViewController, WKNavigationDelegate {
    //@IBOutlet var googleMap: WKWebView!
    var webview: WKWebView!

     override func loadView() {
         webview = WKWebView()
         webview.navigationDelegate = self
         view = webview
     }
    override func viewDidLoad() {
        super.viewDidLoad()
        //let url = URL(string: "https://schallerf1.com")!
        let url = Bundle.main.url(forResource: "index", withExtension: "html", subdirectory: "www")!
        webview.load(URLRequest(url: url))
        webview.allowsBackForwardNavigationGestures = true
        let request = URLRequest(url: url)
        webview.configuration.preferences.javaScriptEnabled = true
        webview.load(request)
    }
}

<!DOCTYPE html>
<html>
    <head>
        <title>Simple Map</title>
        <meta name="viewport" content="initial-scale=1.0">
            <meta charset="utf-8">
                <style>
                    /* Always set the map height explicitly to define the size of the div
                     * element that contains the map. */
                #map {
                    height: 100%;
                }
                /* Optional: Makes the sample page fill the window. */
                html, body {
                    height: 100%;
                    margin: 0;
                    padding: 0;
                }
                </style>
                </head>
    <body>
        <b>WHYYYYYYYYYY!!!!</b>
        <div style="height:100%;width:100%;" id="map"></div>
        <script type="text/javascript">
            var name = "TESTTESTTEST";
            alert('code: '    + name + '\n');
            var map;
            function initMap() {
                map = new google.maps.Map(document.getElementById('map'), {
                                          center: {lat: 39.976068, lng: -83.003297},
                                          zoom: 8
                                          });
            }
        </script>
        <script async defer src="https://maps.googleapis.com/maps/api/js?key=xxxxxxxxxxxxxxxxxx&callback=initMap"></script>
    </body>
</html>

Aucun javascript ne fonctionne, je devrais recevoir une alerte et une simple carte Google devrait s'afficher. Dois-je me pencher sur le serveur web local GCDWebserver ?

1voto

jake Points 1020

Vous devriez appeler votre javascript de la manière suivante WKNavigationDelegate qui est appelée lorsque le chargement de la vue Web est terminé.

public func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
    webView.evaluateJavaScript("initMap()", completionHandler: { (value, err) in
        // Handle response here.
    })
}

Par ailleurs, je ne comprends pas très bien pourquoi vous appelez deux webview.load() demande - ne le faites peut-être pas ?

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