Я разрабатываю приложение через xCode, которое использует геозону и мониторинг региона. Посредством мониторинга этих областей при входе и выходе предполагается вызвать всплывающее окно для отображения пользователю местоположения, в котором они находятся (или выходят) из указанного местоположения. Когда я использую свой файл .gpx, чтобы имитировать выход из и ввод местоположения или сам вход / выход из этого местоположения, к сожалению, функции входа и выхода никогда не вызывают.
До недавних обновлений в Xcode мой код работал отлично, и вызывались функции входа и выхода. Они не звонят сейчас и давно не были. Я провел много исследований по этому вопросу и обнаружил, что с обновлениями в XCode изменение manager.requestWhenInUseAuthorization()
на manager.requestAlwaysAuthorization()
и соответствующее обновление файлов plist должно устранить эту ошибку (manager = CLLocationManager
). Я попробовал это и обновил свой код, но безрезультатно.
Ниже приведено изображение моих файлов P-List для запросов о местоположении пользователей.
Я разместил свой код, относящийся к этой проблеме, ниже, и я и другие были бы очень признательны за любую помощь или идеи о том, как решить эту проблему, поскольку она, похоже, повторяется в обновленном xCode. Спасибо:)
P.S. Другие функции locationManager вызывают. К ним относятся местоположения didUpdate и didStartMonitoring.
import Foundation
import UIKit
import CoreLocation
import MapKit
class ViewController: UIViewController, MKMapViewDelegate, CLLocationManagerDelegate {
@IBOutlet weak var mapView: MKMapView!
var locationManager = CLLocationManager()
override func viewDidLoad() {
super.viewDidLoad()
locationManager = CLLocationManager()
mapView.delegate = self
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.requestAlwaysAuthorization()
locationManager.distanceFilter = kCLLocationAccuracyNearestTenMeters;
locationManager.desiredAccuracy = kCLLocationAccuracyBest;
locationManager.startUpdatingLocation()
mapView.showsUserLocation = true
mapView.setUserTrackingMode(.follow, animated: true)
let title = "Oakville Test"
let coordinate = CLLocationCoordinate2DMake(43.477521, -79.712430)
let regionRadius = 150.0
// setup region
let region = CLCircularRegion(center: CLLocationCoordinate2D(latitude: coordinate.latitude, longitude: coordinate.longitude), radius: regionRadius, identifier: title)
region.notifyOnEntry = true
region.notifyOnExit = true
locationManager.startMonitoring(for: region)
locationManager.startUpdatingLocation()
// setup annotation
let annotationView = MKPointAnnotation()
annotationView.coordinate = coordinate;
annotationView.title = "\(title)";
mapView.addAnnotation(annotationView)
// setup circle
let circle = MKCircle(center: coordinate, radius: regionRadius)
mapView.add(circle)
}
func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer! {
if overlay is MKPolyline {
let renderer = MKPolylineRenderer(overlay: overlay)
renderer.strokeColor = UIColor.blue.withAlphaComponent(0.6)
renderer.lineWidth = 5.0
renderer.fillColor = UIColor.blue.withAlphaComponent(0.7)
return renderer
} else {
let circleRenderer = MKCircleRenderer(overlay: overlay)
circleRenderer.strokeColor = UIColor.red.withAlphaComponent(0.4)
circleRenderer.lineWidth = 1.0
circleRenderer.fillColor = UIColor.red.withAlphaComponent(0.4)
return circleRenderer
}
return nil
}
func showAlert(_ title: String) {
let alert = UIAlertController(title: title, message: nil, preferredStyle: .alert)
let noAction = UIAlertAction(title: "No", style: .default, handler: nil)
let yesAction = UIAlertAction(title: "Yes", style: UIAlertActionStyle.default, handler: nil)
alert.addAction(yesAction)
alert.addAction(noAction)
self.present(alert, animated: true, completion: nil)
}
func locationManager(_ manager: CLLocationManager, didStartMonitoringFor region: CLRegion) {
print("The monitored regions are: \(manager.monitoredRegions)")
}
func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
let locValue:CLLocationCoordinate2D = manager.location!.coordinate
print("locations = \(locValue.latitude) \(locValue.longitude)")
}
func locationManager(_ manager: CLLocationManager, didEnterRegion region: CLRegion) {
showAlert("You are at \(region.identifier)!")
}
func locationManager(_ manager: CLLocationManager, didExitRegion region: CLRegion) {
showAlert("leaving \(region.identifier).")
}
}