2016-07-11 14 views
5

Poniższy kod jest w stanie uzyskać geolokalizację i ją wydrukować. Mam to na podstawie kilku tutoriali online i oglądania Swift Documents. Chcę przekazać geolokalizacje w postaci ciągów od Swift 2 do Javascript. Jestem w stanie uzyskać GeoLocations, nie wiem jak przekazać te Struny do mojego kodu JavaScript w widoku Web.Przekazywanie geolokalizacji z Swift 2 ViewController do metody Javascript

Poniżej znajduje się kod mam:

@IBOutlet weak var Webview: UIWebView! 

let locMgr = CLLocationManager() 

override func viewDidLoad() { 

    super.viewDidLoad() 
    loadAddressURL() 
    locMgr.desiredAccuracy = kCLLocationAccuracyBest 
    locMgr.requestWhenInUseAuthorization() 
    locMgr.startUpdatingLocation() 
    locMgr.delegate = self //necessary 



} 

func locationManager(manager: CLLocationManager , didUpdateLocations locations: [CLLocation]){ 
    let myCurrentLoc = locations[locations.count-1] 
    var myCurrentLocLat:String = "\(myCurrentLoc.coordinate.latitude)" 
    var myCurrentLocLon:String = "\(myCurrentLoc.coordinate.longitude)" 

    print(myCurrentLocLat) 
    print(myCurrentLocLon) 

    //pass to javascript here by calling setIOSNativeAppLocation 

} 

mam JavaScript na mojej stronie z tą metodą:

function setIOSNativeAppLocation(lat , lon){ 

    nativeAppLat = lat; 
    nativeAppLon = lon; 
    alert(nativeAppLat); 
    alert(nativeAppLon); 

} 

Szukałem w innym pytaniu oznaczonym Pass variable from Swift to Javascript z następującym roztworem:

func sendSomething(stringToSend : String) { 
    appController?.evaluateInJavaScriptContext({ (context) -> Void in 

     //Get a reference to the "myJSFunction" method that you've implemented in JavaScript 
     let myJSFunction = evaluation.objectForKeyedSubscript("myJSFunction") 

     //Call your JavaScript method with an array of arguments 
     myJSFunction.callWithArguments([stringToSend]) 

     }, completion: { (evaluated) -> Void in 
      print("we have completed: \(evaluated)") 
    }) 
} 

Jednak nie mam appDelegate i chcę bezpośrednio od t jego widok powoduje te zmiany. Dostaję "użycie nierozwiązanego identyfikatora appDelegate".

+0

Po prostu mglisty pomysł ... Czy możesz włączyć lokalną pamięć w widoku sieciowym, a następnie ustawić ją i odczytać później z javascript? –

Odpowiedz

4

trzeba wdrożyć UIWebView delegata Funkcja .Javascript powinna wywoływać po webviewDidFinishLoad.

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 
    let url = NSURL (string: URLSTRING); 
    let requestObj = NSURLRequest(URL: url!); 
webView.delegate = self 
    webView.loadRequest(requestObj); 
    } 

    func webViewDidFinishLoad(webView: UIWebView) { 
      let javaScriptStr = "setIOSNativeAppLocation(\(myCurrentLoc.coordinate.latitude), \(myCurrentLoc.coordinate.longitude))" 

      webView.stringByEvaluatingJavaScriptFromString(javaScriptStr) 
     } 
4

Odpowiedź, którą podajesz, dotyczy Apple TV, która jest bardzo odmienna od iOS & UIWebView.

Przed próbą uruchomienia dowolnego javascript należy upewnić się, że załadowanie do strony internetowej zostało zakończone (patrz webViewDidFinishLoad).

Gdy widok internetowa jest gotowa i masz swoje dane można utworzyć String który zawiera javascript chcesz wykonać, a następnie przekazać które do widoku internetowej:

let javaScript = "setIOSNativeAppLocation(\(myCurrentLoc.coordinate.latitude), \(myCurrentLoc.coordinate.longitude))" 

webView.stringByEvaluatingJavaScriptFromString(javaScript) 
Powiązane problemy