Как получить только координаты текущего местоположения, если «разрешить один раз» в swift

#swift #mkmapview

#swift #mkmapview

Вопрос:

Я добавил три разрешения в info.plist

и всплывающее окно с тремя вариантами.. здесь

1) если я нажму "allow while using app" , то мне нужно автоматически заполнить текстовые поля текущим адресом местоположения, но

  1. если я нажму "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 для обоих этих разрешений. Вы не можете их различать.

Документация