gpt4 book ai didi

ios - CLLocationManager 总是崩溃并返回 nil 值

转载 作者:行者123 更新时间:2023-11-30 12:22:27 24 4
gpt4 key购买 nike

我已经使用 swift 构建了一个 iOS 应用程序。

我在我的应用程序中实现了核心位置和 map View 。第一次可以顺利运行,没有任何问题(在模拟器或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?

}

最佳答案

正如我在评论中所说:您的问题是 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()

}
}
}

希望这有帮助

关于ios - CLLocationManager 总是崩溃并返回 nil 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44622338/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com