#swift #mkmapview
#swift #mkmapview
Вопрос:
Я добавил три разрешения в info.plist
и всплывающее окно с тремя вариантами.. здесь
1) если я нажму "allow while using app"
, то мне нужно автоматически заполнить текстовые поля текущим адресом местоположения, но
- если я нажму
"allow once"
, мне не нужно автоматически заполнять текстовые поля текущим местоположением
в моем коде как в «разрешить один раз», так и в «разрешить при использовании условий» текстовые поля автоматически заполняются текущим адресом местоположения:
class MapViewController: UIViewController, CLLocationManagerDelegate {
let locationManager = CLLocationManager()
var latitude: String?
var logitude: String?
@IBOutlet weak var text1: UITextField!
@IBOutlet weak var text2: UITextField!
@IBOutlet weak var text3: UITextField!
let annotation = MKPointAnnotation()
@IBOutlet weak var mapView: MKMapView!
override func viewDidLoad() {
super.viewDidLoad()
self.locationManager.requestAlwaysAuthorization()
if CLLocationManager.locationServicesEnabled() {
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters
locationManager.startUpdatingLocation()
}
}
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
guard let _: CLLocationCoordinate2D = manager.location?.coordinate else { return }
let userLocation :CLLocation = locations[0] as CLLocation
latitude = "(userLocation.coordinate.latitude)"
logitude = "(userLocation.coordinate.longitude)"
let geocoder = CLGeocoder()
geocoder.reverseGeocodeLocation(userLocation) { (placemarks, error) in
if (error != nil){
print("error in reverseGeocode")
}
let placemark = placemarks! as [CLPlacemark]
if placemark.count>0{
let placemark = placemarks![0]
let placemarkDictonary: NSDictionary=placemark.addressDictionary as! NSDictionary
self.text1.text=placemarkDictonary["ZIP"] as? String
self.text2.text=placemarkDictonary["City"] as? String
self.text3.text=placemarkDictonary["Street"] as? String
}
}
let center = CLLocationCoordinate2D(latitude: userLocation.coordinate.latitude, longitude: userLocation.coordinate.longitude)
let region = MKCoordinateRegion(center: center, span: MKCoordinateSpan(latitudeDelta: 0.1, longitudeDelta: 0.1))
mapView.setRegion(region, animated: true)
let myAnnotation: MKPointAnnotation = MKPointAnnotation()
myAnnotation.coordinate = CLLocationCoordinate2DMake(userLocation.coordinate.latitude, userLocation.coordinate.longitude);
myAnnotation.title = "Current location"
mapView.addAnnotation(myAnnotation)
locationManager.stopUpdatingLocation()
}
func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
switch status {
case .denied:
print("User hates you!!")
case .authorizedWhenInUse:
let viewController = self.storyboard?.instantiateViewController(withIdentifier: "FinalViewController") as! FinalViewController
self.navigationController?.pushViewController(viewController, animated: true);
case .authorizedAlways:
let viewController = self.storyboard?.instantiateViewController(withIdentifier: "FinalViewController") as! FinalViewController
self.navigationController?.pushViewController(viewController, animated: true);
}
}
}
на самом деле мне нужны только координаты текущего местоположения, когда я нажимаю "allow once"
, нет необходимости автозаполнять адрес в текстовых полях. как это сделать?
пожалуйста, помогите с кодом.
Комментарии:
1. есть ли какой-нибудь способ сделать подобное .. или нет .. пожалуйста, предложите мне что-нибудь
Ответ №1:
When In Use
и Allow Once
— это одно и то же разрешение, но с разной продолжительностью истечения срока действия. Нажатие Allow Once
на запрос разрешения местоположения включит When In Use
разрешение для текущего сеанса приложения, т.Е. пока пользователь принудительно не убьет приложение или если приложение остается в фоновом режиме в течение длительного времени. Если пользователь нажал на Allow Once
разрешение, вы получите все обновления местоположения, как если бы он дал When In Use
разрешение. Но если пользователь завершит работу приложения и перезапустит его, система снова покажет запрос на разрешение местоположения.
Итак, то, что вы пытаетесь сделать, будет невозможно путем проверки статуса, возвращаемого locationManager(_ manager: CLLocationManager, didChangeAuthorization
, поскольку это даст статус as authorizedWhenInUse
для обоих этих разрешений. Вы не можете их различать.