2016-08-05 7 views
1

Ich versuche, Richtungsdaten mit Google API zu erhalten, aber es stürzt weiter ab. Hier ist mein Code:Schnelle Google Directions-API JSON - EXC_BAD_INSTRUCTION (Code = EXC_I386_INVOP, Subcode = 0x0)

let baseURLDirections = "https://maps.googleapis.com/maps/api/directions/json?" 
var selectedRoute: Dictionary<NSObject, AnyObject>! 
var overviewPolyline: Dictionary<NSObject, AnyObject>! 
var originCoordinate: CLLocationCoordinate2D! 
var destinationCoordinate: CLLocationCoordinate2D! 
var originAddress: String! 
var destinationAddress: String! 

func getDirections(origin: String, destination: String, waypoints: Array<String>!, travelMode: AnyObject!, completionHandler: ((status: String, success: Bool) -> Void)) { 

    var directionsURLString = baseURLDirections + "origin=" + origin + "&destination=" + destination 

    directionsURLString = directionsURLString.stringByAddingPercentEncodingWithAllowedCharacters(.URLHostAllowedCharacterSet())! 

    let directionsURL = NSURL(string: directionsURLString) 
    let urlRequest: NSMutableURLRequest = NSMutableURLRequest(URL: directionsURL!) 
    let session = NSURLSession.sharedSession() 
    let task = session.dataTaskWithRequest(urlRequest) { 
     (data, response, error) -> Void in 

     do { 
      let directionsData = NSData(contentsOfURL: directionsURL!) 
      if let dictionary: Dictionary<NSObject, AnyObject> = try NSJSONSerialization.JSONObjectWithData(directionsData!, options: .MutableContainers) as? Dictionary<NSObject, AnyObject> { 

       let status = dictionary["status"] as! String 

       if status == "OK" { 
        self.selectedRoute = (dictionary["routes"] as! Array<Dictionary<NSObject, AnyObject>>)[0] 

        self.overviewPolyline = self.selectedRoute["overview_polyline"] as! Dictionary<NSObject, AnyObject> 

        let legs = self.selectedRoute["legs"] as! Array<Dictionary<NSObject, AnyObject>> 

        let startLocationDictionary = legs[0]["start_location"] as! Dictionary<NSObject, AnyObject> 
        self.originCoordinate = CLLocationCoordinate2DMake(startLocationDictionary["lat"] as! Double, startLocationDictionary["lng"] as! Double) 

        let endLocationDictionary = legs[legs.count - 1]["end_location"]as! Dictionary<NSObject, AnyObject> 
        self.destinationCoordinate = CLLocationCoordinate2DMake(endLocationDictionary["lat"] as! Double, endLocationDictionary["lng"] as! Double) 

        self.originAddress = legs[0]["start_address"]as! String 
        self.destinationAddress = legs[legs.count - 1]["end_address"]as! String 

        self.calculateTotalDistanceAndDuration() 

        completionHandler(status: status, success: true) 
       } 
       else { 
        completionHandler(status: status, success: false) 
       } 
      } 
     } catch let error as NSError { 
      print(error) 
      completionHandler(status: "", success: false) 
     } 
    } 

    task.resume() 
} 

Er sagt: "EXC_BAD_INSTRUCTION (code = EXC_I386_INVOP, Subcode = 0x0)" auf

self.overviewPolyline = self.selectedRoute["overview_polyline"] as! Dictionary<NSObject, AnyObject> 

und auch wenn ich den gesamten Code löschen innerhalb

if let dictionary: Dictionary<NSObject, AnyObject> = try NSJSONSerialization.JSONObjectWithData(directionsData!, options: .MutableContainers) as? Dictionary<NSObject, AnyObject> { 

Ich bekomme EXC_BAD_INSTRUCTION (Code = EXC_I386_INVOP, Subcode = 0x0). Wie löse ich das?

+0

Stellen Sie sicher, dass die optionals Sie sind Kraft-Unwrapping sind in der Tat nicht Null. –

+0

Sie laden die Daten doppelt! Einmal mit NSURLSession und einmal mit NSData ... – Moritz

Antwort

0

Es funktionierte, als ich

geändert
directionsURLString = directionsURLString.stringByAddingPercentEncodingWithAllowedCharacters(.URLHostAllowedCharacterSet())! 

zu

directionsURLString = directionsURLString.stringByAddingPercentEncodingWithAllowedCharacters(.URLQueryAllowedCharacterSet())! 
0

Es funktionierte, als ich

geändert
directionsURLString = directionsURLString.stringByAddingPercentEncodingWithAllowedCharacters(.UR>LHostAllowedCharacterSet())! 

zu

directionsURLString = directionsURLString.stringByAddingPercentEncodingWithAllowedCharacters(.URLQueryAllowedCharacterSet())! 

Danke, dass Sie mich in die richtige Richtung weisen! in Swift 3.0 übersetzt sie in:

SearchString = SearchString.addingPercentEncoding(withAllowedCharacters: CharacterSet.urlQueryAllowed)! 

Hier ist eine andere nützliche String Modifikator für die URL-Vorbereitung ist (entfernt Akzente und so weiter, aber nicht komisch Zeichen wie "ø"):

SearchString = SearchString.folding(options: .diacriticInsensitive, locale: .current) 
Verwandte Themen