我使用swift构建了一个iOS应用。
我在我的应用中实现了核心位置和mapview。这是第一次,它可以顺利运行而没有任何问题(在模拟器或iPhone上)。
该应用可以正常工作,可以从我的iPhone获取当前位置。但是,当我尝试在Xcode中添加GPX位置时,每件事都会发生变化(我想尝试在GPX文件中使用任何位置)。添加GPX文件并将其选为模拟器位置后,我的应用程序始终崩溃,CLLocationManager始终返回nil值。
我认为问题只存在于模拟器中,但我确实也发生在我的iPhone上。即使删除GPX文件后问题仍然存在。
每当我想获得纬度和经度值时,我总是得到'EXC_BAD_INSTRUCTION'。
这是我的代码:
let corLoc = CLLocationManager()
//let corLoc2 = CLLocationManager()
corLoc.delegate = self
let statusLoc = CLLocationManager.authorizationStatus()
if statusLoc == .notDetermined{
corLoc.requestWhenInUseAuthorization()
}
corLoc.desiredAccuracy = kCLLocationAccuracyBest
corLoc.startUpdatingLocation()
let lokasiAwal = CLLocationCoordinate2D(latitude: (corLoc.location?.coordinate.latitude)!, longitude: (corLoc.location?.coordinate.longitude)!) //<--- always return EXC_BAD_INSTRUCTION
let lokasiAkhir = CLLocationCoordinate2D(latitude: -7.299356, longitude: 112.676108)
为了您的信息,以前该应用程序正常使用此代码
请帮帮我
PS:这是我的完整代码
class LocationViewController: UIViewController, MKMapViewDelegate, CLLocationManagerDelegate {
@IBOutlet weak var mapRoute: MKMapView!
var lokasiAwal2 = CLLocation()
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
let userLocation:CLLocation = locations[0] as CLLocation
// manager.stopUpdatingLocation()
lokasiAwal2 = userLocation
}
func locationManager(manager: CLLocationManager!, didChangeAuthorizationStatus status: CLAuthorizationStatus) {
if status == CLAuthorizationStatus.authorizedWhenInUse || status == CLAuthorizationStatus.authorizedAlways {
manager.startUpdatingLocation()
}
}
override func viewDidLoad() {
super.viewDidLoad()
mapRoute.delegate = self
let corLoc = CLLocationManager()
//let corLoc2 = CLLocationManager()
corLoc.delegate = self
let statusLoc = CLLocationManager.authorizationStatus()
if statusLoc == .notDetermined{
corLoc.requestWhenInUseAuthorization()
}
corLoc.desiredAccuracy = kCLLocationAccuracyBest
corLoc.startUpdatingLocation()
//let lokasiAwal = CLLocationCoordinate2D(latitude: (corLoc.location?.coordinate.latitude)!, longitude: (corLoc.location?.coordinate.longitude)!)
let lokasiAwal = CLLocationCoordinate2D(latitude: lokasiAwal2.coordinate.latitude, longitude: lokasiAwal2.coordinate.longitude)
//let lokasiAwal = CLLocationCoordinate2D(latitude: -7.263056, longitude: 112.740317)
let lokasiAkhir = CLLocationCoordinate2D(latitude: -7.299356, longitude: 112.676108)
//-7.299356, 112.676108 NH
//-7.289182, 112.676104 PTC
//-7.282713, 112.687633 bandar jakarta
//-7.263056, 112.740317 TP
//placemark
let awalPlaceMark = MKPlacemark(coordinate: lokasiAwal, addressDictionary: nil)
let akhirPlaceMark = MKPlacemark(coordinate: lokasiAkhir, addressDictionary: nil)
let awalMap = MKMapItem(placemark: awalPlaceMark)
let akhirMap = MKMapItem(placemark: akhirPlaceMark)
//anotasi
let awalAnotasi = MKPointAnnotation()
awalAnotasi.title = "Your Location"
//let awalPin = MKPinAnnotationView.init(annotation: awalAnotasi, reuseIdentifier: "Your Location")
//awalPin.pinTintColor = UIColor.blue
if let locationAwal = awalPlaceMark.location {
awalAnotasi.coordinate = locationAwal.coordinate
}
let akhirAnotasi = MKPointAnnotation()
akhirAnotasi.title = "National Hospital"
if let locationAkhir = akhirPlaceMark.location {
akhirAnotasi.coordinate = locationAkhir.coordinate
}
let awalPin = MyPointAnnotation()
awalPin.coordinate = awalAnotasi.coordinate
awalPin.pinTintColor = .green
awalPin.title = awalAnotasi.title
let akhirPin = MyPointAnnotation()
akhirPin.coordinate = akhirAnotasi.coordinate
akhirPin.pinTintColor = .blue
akhirPin.title = akhirAnotasi.title
//titik marker
self.mapRoute.showAnnotations([awalPin, akhirPin], animated: true)
//menambahkan route
let directionRequest = MKDirectionsRequest()
directionRequest.source = awalMap
directionRequest.destination = akhirMap
directionRequest.transportType = .automobile
let directions = MKDirections(request: directionRequest)
directions.calculate
{
(response, error) -> Void in
guard let response = response else
{
if let error = error {
print("Error : \(error)")
}
return
}
let route = response.routes[0]
self.mapRoute.add((route.polyline), level: MKOverlayLevel.aboveRoads)
let rect = route.polyline.boundingMapRect
self.mapRoute.setRegion(MKCoordinateRegionForMapRect(rect), animated: true)
self.mapRoute.delegate = self
}
// Do any additional setup after loading the view.
}
func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
let renderer = MKPolylineRenderer(overlay: overlay)
renderer.lineWidth = 1.0
renderer.strokeColor = UIColor.red
return renderer
}
func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
var annotView = mapView.dequeueReusableAnnotationView(withIdentifier: "myAnnotation") as? MKPinAnnotationView
if annotView == nil {
annotView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: "myAnnotation")
}
else {
annotView?.annotation = annotation
}
if let annotation = annotation as? MyPointAnnotation {
annotView?.pinTintColor = annotation.pinTintColor
annotView?.canShowCallout = true
}
return annotView
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
/*
// MARK: - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
// Get the new view controller using segue.destinationViewController.
// Pass the selected object to the new view controller.
}
*/
}
这是我的注释类
class MyPointAnnotation : MKPointAnnotation {
var pinTintColor: UIColor?
}
答案 0 :(得分:0)
在viewdidload
&amp;中使用CoreLocation委托获取didUpdateLocations
import UIKit
import CoreLocation
class ViewController: UIViewController,CLLocationManagerDelegate {
let corLoc = CLLocationManager()
override func viewDidLoad() {
super.viewDidLoad()
corLoc.delegate = self
let statusLoc = CLLocationManager.authorizationStatus()
if statusLoc == .notDetermined{
corLoc.requestWhenInUseAuthorization()
}
corLoc.desiredAccuracy = kCLLocationAccuracyBest
corLoc.startUpdatingLocation()
}
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
print((corLoc.location?.coordinate.latitude) ?? "No values")
let lokasiAwal = CLLocationCoordinate2D(latitude: (corLoc.location?.coordinate.latitude)!, longitude: (corLoc.location?.coordinate.longitude)!) //
let lokasiAkhir = CLLocationCoordinate2D(latitude: -7.299356, longitude: 112.676108)
}
}
答案 1 :(得分:0)
你的问题是CLLocationManager
可能还没有任何职位。当数据准备就绪时,将调用委托方法didUpdateLocations
。
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
let userLocation:CLLocation = locations[0] as CLLocation
// manager.stopUpdatingLocation()
lokasiAwal = userLocation
}
答案 2 :(得分:0)
正如我在评论中所说的那样:你的问题是CLLocationManager
可能还没有任何职位,所以你在didUpdateLocations
强制解包可能为零的值,这不会再发生了,因为CLLocationManager
定义了位置
代码的主要变化是
extension LocationViewController : CLLocationManagerDelegate
{
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
if let location = locations.last
{
if((location.horizontalAccuracy) < CLLocationAccuracy(0))
{
return
}
lokasiAwal2 = location
//Calling the method when we are sure that a position is getted
self.updateUIAndGetDirection()
self.corLoc.stopUpdatingLocation() //avoiding continue direction changes
}
}
}
完整代码
import UIKit
import CoreLocation
import MapKit
class LocationViewController: UIViewController {
@IBOutlet weak var mapRoute: MKMapView!
var lokasiAwal2 = CLLocation()
var corLoc = CLLocationManager()
override func viewDidLoad() {
super.viewDidLoad()
mapRoute.delegate = self
//let corLoc2 = CLLocationManager()
corLoc.delegate = self
let statusLoc = CLLocationManager.authorizationStatus()
if statusLoc == .notDetermined{
corLoc.requestWhenInUseAuthorization()
}
corLoc.desiredAccuracy = kCLLocationAccuracyBest
corLoc.startUpdatingLocation()
// Do any additional setup after loading the view.
}
func updateUIAndGetDirection()
{
//let lokasiAwal = CLLocationCoordinate2D(latitude: (corLoc.location?.coordinate.latitude)!, longitude: (corLoc.location?.coordinate.longitude)!)
let lokasiAwal = CLLocationCoordinate2D(latitude: lokasiAwal2.coordinate.latitude, longitude: lokasiAwal2.coordinate.longitude)
//let lokasiAwal = CLLocationCoordinate2D(latitude: -7.263056, longitude: 112.740317)
let lokasiAkhir = CLLocationCoordinate2D(latitude: -7.299356, longitude: 112.676108)
//-7.299356, 112.676108 NH
//-7.289182, 112.676104 PTC
//-7.282713, 112.687633 bandar jakarta
//-7.263056, 112.740317 TP
//placemark
let awalPlaceMark = MKPlacemark(coordinate: lokasiAwal, addressDictionary: nil)
let akhirPlaceMark = MKPlacemark(coordinate: lokasiAkhir, addressDictionary: nil)
let awalMap = MKMapItem(placemark: awalPlaceMark)
let akhirMap = MKMapItem(placemark: akhirPlaceMark)
//anotasi
let awalAnotasi = MKPointAnnotation()
awalAnotasi.title = "Your Location"
//let awalPin = MKPinAnnotationView.init(annotation: awalAnotasi, reuseIdentifier: "Your Location")
//awalPin.pinTintColor = UIColor.blue
if let locationAwal = awalPlaceMark.location {
awalAnotasi.coordinate = locationAwal.coordinate
}
let akhirAnotasi = MKPointAnnotation()
akhirAnotasi.title = "National Hospital"
if let locationAkhir = akhirPlaceMark.location {
akhirAnotasi.coordinate = locationAkhir.coordinate
}
let awalPin = MyPointAnnotation()
awalPin.coordinate = awalAnotasi.coordinate
awalPin.pinTintColor = .green
awalPin.title = awalAnotasi.title
let akhirPin = MyPointAnnotation()
akhirPin.coordinate = akhirAnotasi.coordinate
akhirPin.pinTintColor = .blue
akhirPin.title = akhirAnotasi.title
//titik marker
self.mapRoute.showAnnotations([awalPin, akhirPin], animated: true)
//menambahkan route
let directionRequest = MKDirectionsRequest()
directionRequest.source = awalMap
directionRequest.destination = akhirMap
directionRequest.transportType = .automobile
let directions = MKDirections(request: directionRequest)
directions.calculate
{
(response, error) -> Void in
guard let response = response else
{
if let error = error {
print("Error : \(error)")
}
return
}
let route = response.routes[0]
self.mapRoute.add((route.polyline), level: MKOverlayLevel.aboveRoads)
let rect = route.polyline.boundingMapRect
self.mapRoute.setRegion(MKCoordinateRegionForMapRect(rect), animated: true)
self.mapRoute.delegate = self
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
/*
// MARK: - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
// Get the new view controller using segue.destinationViewController.
// Pass the selected object to the new view controller.
}
*/
}
extension LocationViewController : MKMapViewDelegate
{
func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
let renderer = MKPolylineRenderer(overlay: overlay)
renderer.lineWidth = 1.0
renderer.strokeColor = UIColor.red
return renderer
}
func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
var annotView = mapView.dequeueReusableAnnotationView(withIdentifier: "myAnnotation") as? MKPinAnnotationView
if annotView == nil {
annotView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: "myAnnotation")
}
else {
annotView?.annotation = annotation
}
if let annotation = annotation as? MyPointAnnotation {
annotView?.pinTintColor = annotation.pinTintColor
annotView?.canShowCallout = true
}
return annotView
}
}
extension LocationViewController : CLLocationManagerDelegate
{
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
if let location = locations.last
{
if((location.horizontalAccuracy) < CLLocationAccuracy(0))
{
return
}
lokasiAwal2 = location
self.updateUIAndGetDirection()
self.corLoc.stopUpdatingLocation() //avoiding continue direction changes
}
}
func locationManager(manager: CLLocationManager!, didChangeAuthorizationStatus status: CLAuthorizationStatus) {
if status == CLAuthorizationStatus.authorizedWhenInUse || status == CLAuthorizationStatus.authorizedAlways {
manager.startUpdatingLocation()
}
}
}
希望这有帮助