Search code examples
iosswiftcore-locationcllocationmanagerios-permissions

Check of Location permissions set


My iOS app has been rejected by Apple as the app crashes if a user selected "Dont allow" location access. And the proceeds to tap on my Map button.

How can I wrap this button in check to see if the user has given permission, And if not how can I ask for permission again?

//Map Button Action - Opens Maps - Gives choice of Google or Apple maps
  @IBAction func googleMapBtn(_ sender: UIButton) {
    UIDevice.current.isBatteryMonitoringEnabled = true
    let state = UIDevice.current.batteryState
    //If user is in Loop - Cant open maps
    if state == .charging {
      print("In Loop - Cant open maps")
    }
      //Present Map Options
    else {
      let alertController = UIAlertController.init(title: "Open Map", message: "", preferredStyle: .alert)
      alertController.addAction(UIAlertAction.init(title: "Google Maps", style: .default, handler: { (action) in
        self.googleMapsOpen()
      }))
      alertController.addAction(UIAlertAction.init(title: "Apple Maps", style: .default, handler: { (action) in
        self.appleMapsOpen()
      }))
      alertController.addAction(UIAlertAction.init(title: "Back", style: .default, handler: { (action) in
        self.dismiss(animated: true, completion: nil)
      }))
      self.present(alertController, animated: true) {
      }
    }
  }

The code crashes whenever a user selects a map type Google/Apple and the self.googleMapsOpen() or self.appleMapsOpen() are executed. Specifically is crashed on the let scheme=

func googleMapsOpen(){
    print("Google Maps Pressed")
    let scheme  = "comgooglemaps://?center=\(LocationManager.sharedInstance.location.coordinate.latitude),\(LocationManager.sharedInstance.location.coordinate.longitude)&zoom=15"
    self.open(scheme: scheme)
}

func appleMapsOpen(){
    print("Apple Maps Pressed")
    let scheme  = "http://maps.apple.com/?ll=\(LocationManager.sharedInstance.location.coordinate.latitude),\(LocationManager.sharedInstance.location.coordinate.longitude)&zoom=15"
    self.open(scheme: scheme)
}

Solution

  • You can do something like this :

    func checkLocationPermissionEnabled()
        {
            if CLLocationManager.locationServicesEnabled()
            {
                switch(CLLocationManager.authorizationStatus())
                {
                case .notDetermined, .restricted, .denied:
                    self.openDeviceLocationSetting()
                    return
                case .authorizedAlways, .authorizedWhenInUse:
                    //do whatever you want to do with location
                    return
                }
            }
            else
            {
                self.openDeviceLocationSetting()
                return
            }
        }
    
    
        func openDeviceLocationSetting()
        {
            let alertController = UIAlertController(title: "", message:"For best results, let your device turn on location using Google's location service.", preferredStyle: .alert)
            let okAction = UIAlertAction(title: "OK", style: UIAlertActionStyle.default) {
                UIAlertAction in
                self.isAlertShowing = false
                let settingsUrl = NSURL(string: UIApplicationOpenSettingsURLString)
                if let url = settingsUrl {
                    UIApplication.shared.openURL(url as URL)
                }
            }
            let cancelAction = UIAlertAction(title: "Cancel", style: UIAlertActionStyle.default) {
                UIAlertAction in
    
            }
            alertController.addAction(okAction)
            alertController.addAction(cancelAction)
            self.present(alertController, animated: true, completion: nil)
        }