2017-07-18 2 views
0

J'ai une expérience crash de l'application lors de son utilisation aux États-Unis. Dans tous les autres pays, le même code fonctionne. L'accident se produit en ligne:Obtenir la longitude et la latitude

let latitude = String(format: "%.7f", currentLocation.coordinate.latitude) 

Je ne vois vraiment pas quel est le problème, en particulier cos est lié à des États-Unis et non à d'autres comtés. Toute aide sera très très appréciée.

Mon UserLocation.swift ressemble à ceci:

import UIKit 
import MapKit 

public class GPSLocation { 

static let sharedInstance = GPSLocation() 

//MARK: Public variables 

public var intermediateLatitude: String? 
public var intermediateLongitude: String? 
public var intermediateCountry: String? 
public var intermediateCity: String? 
public var intermediateTimeZone: String? 

//MARK: Get Longitude, Country Code and City name 

func getGPSLocation(completition: @escaping() -> Void) { 

    func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { 

     let locManager = manager 
     var currentLocation: CLLocation! 
     locManager.desiredAccuracy = kCLLocationAccuracyBest 

     if (CLLocationManager.authorizationStatus() == CLAuthorizationStatus.authorizedWhenInUse || CLLocationManager.authorizationStatus() == CLAuthorizationStatus.authorizedAlways) { 

      currentLocation = locManager.location 

      if currentLocation != nil { 
       // Get longitude & latitude 
       let latitude = String(format: "%.7f", currentLocation.coordinate.latitude) 
       let longitude = String(format: "%.7f", currentLocation.coordinate.longitude) 
       self.intermediateLatitude = latitude 
       self.intermediateLongitude = longitude 
       // debugPrint("Latitude:",latitude) 
       // debugPrint("Longitude:",longitude) 

       // Get local time zone GMT 
       let localTimeZoneAbbreviation = TimeZone.current.abbreviation() ?? "" // "GMT-2" 
       let indexStartOfText = localTimeZoneAbbreviation.index(localTimeZoneAbbreviation.startIndex, offsetBy: 3) // 3 
       let timeZone = localTimeZoneAbbreviation.substring(from: indexStartOfText) // "-2" 
       self.intermediateTimeZone = timeZone 
       // debugPrint("GMT:",timeZone) 

       // Get Country code and City 
       let location = CLLocation(latitude: currentLocation.coordinate.latitude, longitude: currentLocation.coordinate.longitude) 
       fetchCountryAndCity(location: location) { countryCode, city in 
        self.intermediateCountry = countryCode 
        self.intermediateCity = city 
        // debugPrint("Country code:",countryCode) 
        // debugPrint("City:",city) 

        completition() 
       } 
      } else { 
       // Location is NIL 
      } 
     } 
    } 
    locManager.delegate = self // and conform protocol 
    locationManager.startUpdatingLocation() 
} 

//MARK: Find countryCode & City name from longitude & latitude 

func fetchCountryAndCity(location: CLLocation, completion: @escaping (String, String) ->()) { 
    CLGeocoder().reverseGeocodeLocation(location) { placemarks, error in 
     if let error = error { 
      debugPrint(error) 
     } else if let countryCode = placemarks?.first?.isoCountryCode, 
      let city = placemarks?.first?.locality { 
      completion(countryCode, city) 
     } 
    } 
} 
} 
+0

Avez-vous vérifié que ' locManager.location' n'est pas 'nil'? –

+0

Devrais-je boucler le bloc entier si locManager.location n'est pas nul // Obtenir la longitude et la latitude jusqu'à la fin de completionition() dans cette instruction if ...? –

+0

Commencez par isoler le problème. Si locManager.location est nul, le problème n'est pas lié à String (format: ...). Ensuite, recherchez "CLLocationManager emplacement est nul", il y a déjà beaucoup de questions et réponses à ce sujet. –

Répondre

1

Vous devez vérifier l'emplacement dans la méthode délégué

func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { 
      manager.stopUpdatingLocation() // if you dont want continuously update 

      currentLocation = manager.location 
     let location = CLLocation(latitude: currentLocation.coordinate.latitude, longitude: currentLocation.coordinate.longitude) 
    fetchCountryAndCity(location: location) { countryCode, city in 
     self.intermediateCountry = countryCode 
     self.intermediateCity = city 
     // debugPrint("Country code:",countryCode) 
     // debugPrint("City:",city) 

     completition() 
    } 
    } 

et délégué mis

locManager.delegate = self // and conform protocol 
locationManager.startUpdatingLocation() 
+0

Je suis débutant dans swift, désolé de demander ... Si je change de classe entière (code) avec votre code ... est-ce que ça va envoyer l'emplacement en permanence? Je dois passer de cette classe résultats de long, lat, countryCode et ville, une seule fois à l'autre classe. Mettre à jour seulement quand je l'appelle d'une autre classe. –

+0

Si vous ne voulez pas continuellement, vous pouvez arrêter la mise à jour de cllocationManage dans cette méthode ** didUpdateLocations **. – KKRocks

+0

Donc, je devrais mettre la fonction de votre réponse dans AppDelegate.swift dans didFinishLaunchingWithOptions ..? ou dans ViewController dans lequel j'ai besoin des résultats de func getGPSLocation ..? –