Как я могу предложить пользователю включить службы определения местоположения после того, как пользователь запретил их использование

У меня есть приложение с явным взаимодействием с пользователем, которое использует текущее местоположение пользователя. Если пользователь отказывает в доступе к службам определения местоположения, я все же хотел бы, чтобы последующее использование предлагало пользователю перейти к настройкам и повторно включить службы определения местоположения для моего приложения.

Мне нужно поведение встроенного приложения Карт:

  1. Сбросьте предупреждения о местоположении в настройках> Общие> Сбросить> Сбросить предупреждения о местоположении.
  2. Запустите приложение Карт.
  3. Нажмите кнопку «Текущее местоположение» в левом нижнем углу.
  4. В запросах карт с "" Карты "хотели бы использовать ваше текущее местоположение" | "Не разрешать" | "Разрешить".
  5. Выберите параметр "Не разрешать".
  6. Снова нажмите кнопку «Текущее местоположение» в левом нижнем углу.
  7. Карты предлагают «Включить службы определения местоположения, чтобы разрешить« Картам »определять ваше местоположение» | «Настройки» | "Отменить".

В моем собственном приложении тот же основной поток приводит к тому, что мой CLLocationManagerDelegate -locationManager: didFailWithError: метод вызывается с ошибкой kCLErrorDenied на последнем этапе, и пользователю не предоставляется возможность открыть приложение «Настройки» для его исправления.

Я мог бы отобразить свое собственное предупреждение в ответ на ошибку, но у него не было бы возможности запустить приложение «Настройки», такое как предупреждение, которое ОС может выдавать при использовании встроенного приложения «Карты».

Есть ли в классе CLLocationManager что-то, чего мне не хватает, что могло бы дать мне такое поведение?

69 голосов | спросил GBegen 4 FebruaryEurope/MoscowbFri, 04 Feb 2011 00:29:55 +0300000000amFri, 04 Feb 2011 00:29:55 +030011 2011, 00:29:55

11 ответов


0

В iOS8 вы можете, наконец, связать пользователя с приложением «Настройки» через openURL. Например, вы можете создать UIAlertView с помощью одной кнопки, которая приведет пользователя в приложение «Настройки»:

    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:ICLocalizedString(@"LocationServicesPermissionTitle")
                                                    message:ICLocalizedString(@"LocationPermissionGeoFenceMessage")
                                                   delegate:self
                                          cancelButtonTitle:@"Settings"
                                          otherButtonTitles:nil];
    [alert show];

В вашем делегате UIAlertView:

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
    [alertView dismissWithClickedButtonIndex:buttonIndex animated:YES];
    [[UIApplication sharedApplication] openURL: [NSURL URLWithString: UIApplicationOpenSettingsURLString]];
}
ответил mobileideafactory.com 14 AM00000010000005831 2014, 01:39:58
0

Update:

Начиная с iOS 8, теперь есть константа UIApplicationOpenSettingsURLString, представляющая URL-адрес, который при открытии открывает приложение «Настройки» для вашего настройки приложения (где пользователь может затем снова включить службы определения местоположения).


Оригинал:

Для вас нет способа сделать это. Единственный реальный вариант - отобразить предупреждение, информирующее пользователя о том, что вашему приложению требуются службы определения местоположения, и дать им указание вручную перейти в приложение «Настройки» и включить его.

ответил Lily Ballard 10 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowSat, 10 Sep 2011 04:45:29 +0400 2011, 04:45:29
0

AlertViews устарели в iOS 8. Теперь есть лучший способ обработки оповещений с помощью нового AlertController:

UIAlertController *alertController = [UIAlertController alertControllerWithTitle:NSLocalizedString( @"Enter your title here", @"" ) message:NSLocalizedString( @"Enter your message here.", @"" ) preferredStyle:UIAlertControllerStyleAlert];

UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:NSLocalizedString( @"Cancel", @"" ) style:UIAlertActionStyleCancel handler:nil];
UIAlertAction *settingsAction = [UIAlertAction actionWithTitle:NSLocalizedString( @"Settings", @"" ) style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
   [[UIApplication sharedApplication] openURL:[NSURL URLWithString:
                                                    UIApplicationOpenSettingsURLString]];
}];

[alertController addAction:cancelAction];
[alertController addAction:settingsAction];

[self presentViewController:alertController animated:YES completion:nil];
ответил Markus 12 MarpmThu, 12 Mar 2015 13:12:52 +03002015-03-12T13:12:52+03:0001 2015, 13:12:52
0

В соответствии с Документы Apple по методу locationServicesEnabled .

  

Пользователь может включить или отключить службы определения местоположения из приложения «Настройки», переключив переключатель «Службы определения местоположения» в целом.

     

Перед началом обновления местоположения необходимо проверить возвращаемое значение этого метода, чтобы определить, включены ли у пользователя службы определения местоположения для текущего устройства. Если этот метод возвращает NO и вы все равно запускаете обновления местоположения, базовая структура местоположения предлагает пользователю подтвердить, нужно ли повторно включить службы определения местоположения.

Таким образом, вы не можете просто запустить обновления служб определения местоположения, чтобы вызвать предупреждение?

ответил iOS Calendar View OnMyProfile 1 J000000Sunday12 2012, 20:40:35
0

Вот быстрая 3 реализация кода, предоставленного Markus и bjc.

let alertController = UIAlertController(title: NSLocalizedString("Enter your title here", comment: ""), message: NSLocalizedString("Enter your message here.", comment: ""), preferredStyle: .alert)

let cancelAction = UIAlertAction(title: NSLocalizedString("Cancel", comment: ""), style: .cancel, handler: nil)
let settingsAction = UIAlertAction(title: NSLocalizedString("Settings", comment: ""), style: .default) { (UIAlertAction) in
                UIApplication.shared.openURL(NSURL(string: UIApplicationOpenSettingsURLString)! as URL)
            }

alertController.addAction(cancelAction)
alertController.addAction(settingsAction)
            self.present(alertController, animated: true, completion: nil)
ответил Munib 29 Jam1000000amSun, 29 Jan 2017 05:20:37 +030017 2017, 05:20:37
0

В Swift 4 есть обновление в его синтаксисе.

Swift 4

extension UIAlertController {

    func createSettingsAlertController(title: String, message: String) {

      let alertController = UIAlertController(title: title, message: message, preferredStyle: .alert)

      let cancelAction = UIAlertAction(title: NSLocalizedString("Cancel", comment: ""), style: .cancel, handler: nil)
      let settingsAction = UIAlertAction(title: NSLocalizedString("Settings", comment: ""), style: .default) { (UIAlertAction) in
        UIApplication.shared.open(URL(string: UIApplicationOpenSettingsURLString)! as URL, options: [:], completionHandler: nil)
      }

      alertController.addAction(cancelAction)
      alertController.addAction(settingsAction)
      self.present(alertController, animated: true, completion: nil)

   }
}
ответил omi23 18 Jam1000000amThu, 18 Jan 2018 09:02:39 +030018 2018, 09:02:39
0

Полагаю, у вас будет ответ на ваш вопрос, когда Apple подумает о новом SDK. В настоящее время и, насколько я знаю, это невозможно:

URL-обработчик недоступен
Нет используемого метода для вызова

Но ... Как это делает Maps, это МОЖЕТ быть сделано, но, вероятно, с использованием частного API. Если вы не боитесь такого рода кодирования, вы должны искать там, по моему мнению.

ответил Oliver 10 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowSat, 10 Sep 2011 04:42:43 +0400 2011, 04:42:43
0

Вот Swift-версия кода в ответе Маркуса. Этот код создает предупреждение, которое дает пользователю возможность открыть настройки.

let alertController = UIAlertController(title: NSLocalizedString("Enter your title here", comment: ""), message: NSLocalizedString("Enter your message here.", comment: ""), preferredStyle: .Alert)

let cancelAction = UIAlertAction(title: NSLocalizedString("Cancel", comment: ""), style: .Cancel, handler: nil)
let settingsAction = UIAlertAction(title: NSLocalizedString("Settings", comment: ""), style: .Default) { (UIAlertAction) in
    UIApplication.sharedApplication().openURL(NSURL(string: UIApplicationOpenSettingsURLString)!)
}

alertController.addAction(cancelAction)
alertController.addAction(settingsAction)
self.presentViewController(alertController, animated: true, completion: nil)
ответил bjc 18 Jam1000000amWed, 18 Jan 2017 11:21:35 +030017 2017, 11:21:35
0

Swift

Как только вы отключите службы определения местоположения для приложения, методы делегата менеджера местоположения начнут показывать ошибку. Таким образом, при получении ошибки мы можем проверить, включены ли службы определения местоположения. И в зависимости от результата мы можем попросить пользователя перейти в настройки и включить службы определения местоположения.

В методе делегата диспетчера местоположений для ошибки добавьте проверку разрешения местоположения

func locationManager(manager: CLLocationManager!, didFailWithError error: NSError!) {
    DispatchQueue.main.asyncAfter(deadline: .now() + 0.4) {
            //check  location permissions
            self.checkLocationPermission()
        }
}

Код для проверки разрешения местоположения

//check location services enabled or not

    func checkLocationPermission() {
        if CLLocationManager.locationServicesEnabled() {
            switch(CLLocationManager.authorizationStatus()) {
            case .notDetermined, .restricted, .denied:
                //open setting app when location services are disabled
            openSettingApp(message:NSLocalizedString("please.enable.location.services.to.continue.using.the.app", comment: ""))
            case .authorizedAlways, .authorizedWhenInUse:
                print("Access")
            }
        } else {
            print("Location services are not enabled")
            openSettingApp(message:NSLocalizedString("please.enable.location.services.to.continue.using.the.app", comment: ""))
        }
    }

Код для открытия приложения настроек,

//open location settings for app
func openSettingApp(message: String) {
    let alertController = UIAlertController (title: APP_NAME_TITLE, message:message , preferredStyle: .alert)

    let settingsAction = UIAlertAction(title: NSLocalizedString("settings", comment: ""), style: .default) { (_) -> Void in
        guard let settingsUrl = URL(string: UIApplicationOpenSettingsURLString) else {
            return
        }

        if UIApplication.shared.canOpenURL(settingsUrl) {
            UIApplication.shared.open(settingsUrl, options: [:], completionHandler: nil)
        }
    }
    alertController.addAction(settingsAction)
    let cancelAction = UIAlertAction(title: NSLocalizedString("cancel", comment: ""), style: .default, handler: nil)
    alertController.addAction(cancelAction)

    present(alertController, animated: true, completion: nil)
}
ответил Pramod More 12 J0000006Europe/Moscow 2018, 16:18:30
0

Расширение Swift 3 для создания настроек оповещения контроллера:

Фонд импорта

extension UIAlertController {
    func createSettingsAlertController(title: String, message: String) -> UIAlertController {
        let controller = UIAlertController(title: title, message: message, preferredStyle: .alert)

        let cancelAction = UIAlertAction(title: NSLocalizedString("Cancel", comment:"" ), style: .cancel, handler: nil)
        let settingsAction = UIAlertAction(title: NSLocalizedString("Settings", comment:"" ), style: .default, handler: { action in
            UIApplication.shared.openURL(URL(string: UIApplicationOpenSettingsURLString)!)
        })
        controller.addAction(cancelAction)
        controller.addAction(settingsAction)

        return controller
    }
}
ответил Roman Barzyczak 5 AMpTue, 05 Apr 2016 10:15:50 +030015Tuesday 2016, 10:15:50
0

последняя версия swift, основанная на ответах выше.

func showSettingsAlert(_ from:UIViewController, title:String?, message:String?) {

        let alertController = UIAlertController(title: title, message: message, preferredStyle: .alert)

        let cancelAction = UIAlertAction(title: NSLocalizedString("Cancel", comment: ""), style: .cancel, handler: nil)

        let settingsAction = UIAlertAction(title: NSLocalizedString("Settings", comment: ""), style: .default) { (UIAlertAction) in

            guard let settingsUrl = URL(string: UIApplicationOpenSettingsURLString) else {
                return
            }

            if UIApplication.shared.canOpenURL(settingsUrl) {
                UIApplication.shared.open(settingsUrl, options: [:], completionHandler: nil)
            }
        }

        alertController.addAction(cancelAction)
        alertController.addAction(settingsAction)
        from.present(alertController, animated: true, completion: nil)
    }
ответил Chris 28 PM00000070000003331 2018, 19:42:33

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132