Xcode 9.1 Swift 4
这是我在控制台中遇到的错误: [Common] _BSMachError:端口6507; (os / kern)无效功能(0x14)“无法插入COPY_SEND”
我正在尝试让我的地图在模拟器中显示用户位置(自定义位置)并居中并缩放该位置。我已经实施了
隐私 - 位置始终和何时使用用法说明
隐私 - 使用时的位置用法说明
隐私 - 位置始终使用说明
在info.plist中所有字符串值。
以下是我的MapVC viewcontroller中的代码:
import UIKit
import MapKit
import CoreLocation
class MapVC: UIViewController {
@IBOutlet weak var mapView: MKMapView!
var locationManager = CLLocationManager()
let authorizationStatus = CLLocationManager.authorizationStatus()
let regionRadius: Double = 1000
override func viewDidLoad() {
super.viewDidLoad()
mapView.delegate = self
locationManager.delegate = self
configureLocationServices()
mapView.showsUserLocation = true
}
}
extension MapVC: MKMapViewDelegate {
func centerMapOnUserLocation() {
guard let coordinate = locationManager.location?.coordinate else { return }
let coordinateRegion = MKCoordinateRegionMakeWithDistance(coordinate, regionRadius * 2.0, regionRadius * 2.0)
mapView.setRegion(coordinateRegion, animated: true)
}
}
extension MapVC: CLLocationManagerDelegate {
func configureLocationServices() {
if authorizationStatus == .notDetermined {
locationManager.requestAlwaysAuthorization()
} else {
return
}
}
func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
centerMapOnUserLocation()
}
}
运行应用程序时,会出现“访问位置”弹出窗口,我选择“始终允许”或“仅在使用应用程序时”。弹出窗口消失,一旦检查模拟器的隐私设置,它就反映了我的选择。但之后没有任何事情发生。我怀疑守卫让坐标没有返回任何坐标所以它的“其他{返回}正在被调用并停在那里?现在这里是有趣的部分。如果我进入设置/隐私并选择其他允许选项可用,当我回到应用程序,它完全按照我的意愿执行centerMapOnUserLocation。
我已经尝试了大多数可以在SO以及其他网站上找到的适用建议。似乎没什么用。我尝试从头开始重建应用程序3次,所有结果都相同。我刚刚更新到Xcode 9.2同样的问题。任何帮助将不胜感激。提前致谢!!所需的任何其他信息只是让我知道,我会发布它。
答案 0 :(得分:0)
我在 Xcode 9.1 和 Swift 4
中的完整答案首先在ViewController上添加MapView,然后连接代理&检查故事板中的用户位置 选中标记,并将MapView插座添加到ViewController.swift文件中。使用名为 getCurrentLocationAction()的actionMethod添加一个Button,以获取ViewController.swift文件中的当前位置。更新您的ViewController.swift文件,如下所示。
另外,请不要忘记在info.plist文件中添加两个重要的密钥。
1.Privacy - 位置始终用法说明。
2.隐私 - 使用时的位置用法说明
import UIKit
import MapKit
class ViewController: UIViewController, MKMapViewDelegate {
@IBOutlet weak var mapView: MKMapView!
fileprivate var annotation: MKAnnotation!
fileprivate var locationManager: CLLocationManager!
fileprivate var isCurrentLocation: Bool = false
override func viewDidLoad() {
super.viewDidLoad()
mapView.delegate = self
mapView.mapType = .standard
}
@IBAction func getCurrentLocationAction(_ sender: Any) {
if (CLLocationManager.locationServicesEnabled()) {
if locationManager == nil {
locationManager = CLLocationManager()
}
locationManager.requestWhenInUseAuthorization()
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.requestAlwaysAuthorization()
locationManager.startUpdatingLocation()
}
}
}
现在创建一个扩展并添加CLLocationManagerDelegate方法。
extension ViewController : CLLocationManagerDelegate{
// MARK: - CLLocationManagerDelegate
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
let location = locations.last
let center = CLLocationCoordinate2D(latitude: location!.coordinate.latitude, longitude: location!.coordinate.longitude)
let region = MKCoordinateRegion(center: center, span: MKCoordinateSpan(latitudeDelta: 0.01, longitudeDelta: 0.01))
self.mapView.setRegion(region, animated: true)
if self.mapView.annotations.count != 0 {
annotation = self.mapView.annotations[0]
self.mapView.removeAnnotation(annotation)
}
let pointAnnotation = MKPointAnnotation()
pointAnnotation.coordinate = location!.coordinate
pointAnnotation.title = ""
mapView.addAnnotation(pointAnnotation)
}
}
希望这会有所帮助。快乐编码:)