2016-06-14 2 views
6

Je fais une application hybride iOS en utilisant swift 2 et HTML/Javascript. J'ai un shell natif qui reçoit des informations du calendrier et du GPS. Je voudrais afficher ces informations dans mon WKWebView et les mettre à jour toutes les secondes. Je travaille avec HTML local.Comment puis-je envoyer des données de swift à javascript et les afficher dans ma vue Web?

J'ai trouvé un exemple montrant comment communiquer entre le code natif et le JS mais rien sur comment transférer mes données "natives" et les afficher dans la vue web. Merci.

+0

Travaillez-vous sur iOS ou OS X? –

+0

Je travaille sur une application iOS hybride – Lola

Répondre

6

Vous devez demander au gestionnaire de position de mettre à jour l'emplacement pour vous au lieu de configurer un NSTimer de 1 seconde pour le faire vous-même. Et pour transmettre des données à Javascript, vous pouvez utiliser la méthode evaluateJavaScript de WKWebView:

import UIKit 
import WebKit 
import CoreLocation 

class ViewController: UIViewController, CLLocationManagerDelegate { 
    weak var webView: WKWebView! 
    let locationManager = CLLocationManager() 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     createWebView() 
     locationManager.delegate = self 
     locationManager.startUpdatingLocation() 
     locationManager.requestWhenInUseAuthorization() 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    func createWebView() { 
     let url = NSBundle.mainBundle().URLForResource("my_page", withExtension: "html")! 

     let webView = WKWebView() 
     webView.loadFileURL(url, allowingReadAccessToURL: url) 
     webView.translatesAutoresizingMaskIntoConstraints = false 

     self.view.addSubview(webView) 

     // Auto Layout 
     let views = ["webView": webView] 
     let c1 = NSLayoutConstraint.constraintsWithVisualFormat("H:|[webView]|", options: [], metrics: nil, views: views) 
     let c2 = NSLayoutConstraint.constraintsWithVisualFormat("V:[webView]|", options: [], metrics: nil, views: views) 
     let c3 = NSLayoutConstraint(item: webView, attribute: .Top, relatedBy: .Equal, toItem: self.topLayoutGuide , attribute: .Bottom, multiplier: 1, constant: 0) 
     NSLayoutConstraint.activateConstraints(c1 + c2 + [c3]) 

     // Pass the reference to the View's Controller 
     self.webView = webView 
    } 

    func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { 
     let lastLocation = locations.last! 

     let dict = [ 
      "lat": lastLocation.coordinate.latitude, 
      "long": lastLocation.coordinate.longitude 
     ] 
     let jsonData = try! NSJSONSerialization.dataWithJSONObject(dict, options: []) 
     let jsonString = String(data: jsonData, encoding: NSUTF8StringEncoding)! 

     // Send the location update to the page 
     self.webView.evaluateJavaScript("updateLocation(\(jsonString))") { result, error in 
      guard error == nil else { 
       print(error) 
       return 
      } 
     } 
    } 
} 

et my_page.html:

<!DOCTYPE html> 
<html> 
<head> 
    <meta http-equiv="Content-type" content="text/html; charset=utf-8"> 
    <meta name="viewport" content="width=device-width; initial-scale=1.0"> 
    <title>This is a test page</title> 
    <script type="text/javascript"> 
    function updateLocation(data) 
    { 
     var ele = document.getElementById('location'); 
     ele.innerHTML = 'Last location: lat = ' + data['lat'] + ', long = ' + data['long']; 
    } 
    </script> 
</head> 
<body> 
    <p id="location">Last location:</p> 
</body> 
</html> 

Si vous testez cela dans le simulateur, choisissez Debug> Lieu> City Run pour voir il se met à jour continuellement (comme si vous couriez dans un parc).

+0

Merci beaucoup pour votre aide! Cela fonctionne parfaitement :) – Lola

+1

Assurez-vous simplement que la chaîne JSON ne contient pas de caractères de nouvelle ligne sans échappement. 'evaluateJavaScript' ne fonctionnera que si les caractères de nouvelle ligne sont échappés. – Crashalot

+0

En outre, dans NSJSONSerialization n'utilisez pas l'option .prettyPrinted, utilisez [] comme ci-dessus, ou cela ne fonctionnera pas non plus. – TerryB