Ich habe eine Anwendung mit einer expliziten Benutzerinteraktion, die den aktuellen Standort des Benutzers verwendet. Wenn der Benutzer den Zugriff auf Ortungsdienste verweigert, möchte ich nachfolgende Verwendungen, um den Benutzer aufzufordern, zu den Einstellungen zu wechseln und die Ortungsdienste für meine App wieder zu aktivieren.
Ich möchte das Verhalten der integrierten Maps-App:
- Standortwarnungen unter Einstellungen> Allgemein> Zurücksetzen> Standortwarnungen zurücksetzen zurücksetzen.
- Starten Sie die Karten-App.
- Tippen Sie unten links auf die Schaltfläche Aktueller Standort.
- Eingabeaufforderungen für Karten mit "" Karten "möchten Ihren aktuellen Standort verwenden" | "Nicht zulassen" | "Ermöglichen".
- Wählen Sie die Option "Nicht zulassen".
- Tippen Sie erneut auf die Schaltfläche Aktueller Standort in der unteren linken Ecke.
- Karten werden mit der Option "Standortdienste aktivieren" aktiviert, damit "Karten" Ihren Standort bestimmen können "| "Einstellungen" | "Stornieren".
In meiner eigenen App führt der gleiche grundlegende Ablauf dazu, dass meine CLLocationManagerDelegate -locationManager: didFailWithError: -Methode im letzten Schritt mit einem kCLErrorDenied-Fehler aufgerufen wird und der Benutzer nicht die Option erhält, die Einstellungen-App zu öffnen, um sie zu korrigieren.
Ich könnte meine eigene Warnung als Reaktion auf den Fehler anzeigen, aber es wäre nicht möglich, die Einstellungen-App wie die Warnung zu starten, die das Betriebssystem bereitstellen kann, wie sie von der integrierten Karten-App verwendet wird.
Gibt es etwas in der CLLocationManager-Klasse, das mir fehlt, das mir dieses Verhalten geben könnte?
quelle
Antworten:
Mit iOS8 können Sie den Benutzer endlich über openURL mit der Einstellungen-App verknüpfen. Sie können beispielsweise eine UIAlertView mit einer einzigen Schaltfläche erstellen, die den Benutzer zur Einstellungen-App führt:
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:ICLocalizedString(@"LocationServicesPermissionTitle") message:ICLocalizedString(@"LocationPermissionGeoFenceMessage") delegate:self cancelButtonTitle:@"Settings" otherButtonTitles:nil]; [alert show];
In Ihrem UIAlertView-Delegaten:
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { [alertView dismissWithClickedButtonIndex:buttonIndex animated:YES]; [[UIApplication sharedApplication] openURL: [NSURL URLWithString: UIApplicationOpenSettingsURLString]]; }
quelle
Aktualisieren:
Ab iOS 8 gibt es jetzt die Konstante,
UIApplicationOpenSettingsURLString
die eine URL darstellt, die beim Öffnen die App "Einstellungen" mit den Einstellungen Ihrer Anwendung öffnet (wo der Benutzer die Standortdienste wieder aktivieren kann).Original:
Es gibt keine Möglichkeit für Sie, dies zu tun. Ihre einzige echte Option besteht darin, eine Warnung anzuzeigen, die den Benutzer darüber informiert, dass für Ihre Anwendung Ortungsdienste erforderlich sind, und ihn anzuweisen, manuell zur App Einstellungen zu wechseln und sie zu aktivieren.
quelle
Settings
Verwendung umleitetUIApplicationOpenSettingsURLString
.AlertViews sind in iOS 8 veraltet . Es gibt jetzt eine bessere Möglichkeit, Warnungen mit dem neuen AlertController zu verarbeiten:
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];
quelle
Laut Apples Docs zur locationServicesEnabled- Methode.
Können Sie also nicht einfach die Aktualisierung der Ortungsdienste starten, um eine Warnung auszulösen?
quelle
Hier ist die schnelle 3-Implementierung des von Markus und bjc bereitgestellten Codes.
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)
quelle
In Swift 4 gibt es ein Update in der Syntax.
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) } }
quelle
Ich denke, Sie werden eine Antwort auf Ihre Frage haben, wenn Apple über ein neues SDK nachdenkt. Zum gegenwärtigen Zeitpunkt und soweit ich weiß, ist dies nicht möglich:
Kein URL-Handler verfügbar
Keine verwendbare Methode zum Aufrufen
Aber ... Wie Maps es tut, kann dies getan werden, aber wahrscheinlich unter Verwendung einer privaten API. Wenn Sie mit dieser Art der Codierung keine Angst haben, sollten Sie dort meiner Meinung nach suchen.
quelle
Hier ist eine Swift-Version des Codes in der Antwort von Markus. Dieser Code erstellt eine Warnung, die dem Benutzer die Möglichkeit gibt, Einstellungen zu öffnen.
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)
quelle
Schnell ,
Sobald Sie die Standortdienste für eine App deaktivieren, werden bei den Delegierungsmethoden des Standortmanagers Fehler angezeigt. Wenn wir also einen Fehler erhalten, können wir überprüfen, ob die Ortungsdienste aktiviert / deaktiviert sind. Entsprechend dem Ergebnis können wir den Benutzer bitten, zu den Einstellungen zu gehen und die Ortungsdienste zu aktivieren.
Fügen Sie in der Delegierungsmethode Ihres Standortmanagers für Fehler eine Standortberechtigungsprüfung hinzu
func locationManager(manager: CLLocationManager!, didFailWithError error: NSError!) { DispatchQueue.main.asyncAfter(deadline: .now() + 0.4) { //check location permissions self.checkLocationPermission() } }
Code zur Überprüfung der Standortberechtigung
//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: "")) } }
Code zum Öffnen der Einstellungs-App,
//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) }
quelle
neueste schnelle Version basierend auf den obigen Antworten.
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) }
quelle
Swift 3-Erweiterung zum Erstellen von Einstellungen Alarm Controller:
Foundation importieren
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 } }
quelle