2016-06-14 35 views
6

Sto facendo un'app ibrida iOS usando swift 2 e HTML/Javascript. Ho una shell nativa che ottiene alcune informazioni dal calendario e dal GPS. Vorrei visualizzare queste informazioni nel mio WKWebView e aggiornarle ogni secondo. Sto lavorando con HTML locale.Come posso inviare dati da rapido a javascript e visualizzarli nella mia vista web?

Ho trovato qualche esempio che mostra come comunicare tra il codice nativo e il JS ma nulla su come trasferire i miei dati "nativi" e visualizzarli nella vista Web. Grazie.

+0

Stai lavorando su iOS o OS X? –

+0

Sto lavorando su un'app iOS hybride – Lola

risposta

6

Dovresti chiedere al Gestore località di aggiornare la posizione per te invece di impostare undi 1 secondo per farlo da solo. E per passare i dati al Javascript, è possibile utilizzare evaluateJavaScript metodo 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 
      } 
     } 
    } 
} 

e 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> 

Se si sta testando questo nel simulatore, scegliere Debug> Posizione> City Run per vedere si aggiorna continuamente (come se si attraversasse un parco).

+0

Grazie mille per il vostro aiuto! Funziona perfettamente :) – Lola

+1

Assicurati solo che la stringa JSON non contenga caratteri di nuova riga senza caratteri di escape. 'evaluateJavaScript' non funzionerà a meno che i caratteri di nuova riga non siano sfuggiti. – Crashalot

+0

Inoltre, in NSJSONSerialization non utilizzare l'opzione .prettyPrinted, utilizzare [] come sopra, altrimenti non funzionerà. – TerryB