2013-06-21 4 views
6

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

Я видел несколько постов на StackOverflow, но есть старые, есть решение сейчас, чтобы позвонить в новом SDK или кто-то нашел способ,

Сообщение относятся: CLLocation ask again for permission

+2

, что до сих пор нет способа, если пользователь выбирает «разрешить» или «запретить», есть только один раз изменить в приложение установлено – adali

ответ

8

К сожалению, вы не можете этого сделать. Одна вещь, которую вы можете сделать, - предложить пользователю изменить настройки местоположения.

if (![CLLocationManager locationServicesEnabled]) 
{ 
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Location Service Disabled" 
                 message:@"To re-enable, please go to Settings and turn on Location Service for this app." 
                 delegate:nil 
               cancelButtonTitle:@"OK" 
               otherButtonTitles:nil]; 
     [alert show]; 
} 
+1

Я уже сделал это, но клиент u знаю, хочу все, что у них есть в уме: | –

+0

приятно :) лучше, вы должны сказать ситуацию и это преимущества для клиента. – manujmv

0

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

5

Похоже, что принятый ответ не совсем прав. [CLLocationManager locationServicesEnabled] проверяет, включены ли службы определения местоположения, как описано в документации.

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

Если вы хотите проверить, предоставляется ли вам разрешение на использование его/ее местоположения, вы должны установить [CLLocationManager authorizationStatus]. Если статус вашего приложения равен kCLAuthorizationStatusDenied, это означает, что пользователь явно отклонил ваше приложение, когда он попросил разрешения. Вы можете использовать это и соответствующим образом информировать пользователя.

5

в ios8, apple представила константу UIApplicationOpenSettingsURLString, которая является местоположением представления «настроек» устройства.

можно закодировать следующим образом (в Свифт), чтобы направить пользователя к настройкам просмотра:

switch CLLocationManager.authorizationStatus() { 
    case .AuthorizedWhenInUse, .Restricted, .Denied: 
     let alertController = UIAlertController(
      title: "Background Location Access Disabled", 
      message: "In order to be notified, please open this app's settings and set location access to 'Always'.", 
      preferredStyle: .Alert) 

     let cancelAction = UIAlertAction(title: "Cancel", style: .Cancel, handler: nil) 
     alertController.addAction(cancelAction) 

     let openAction = UIAlertAction(title: "Open Settings", style: .Default) { (action) in 
      if let url = NSURL(string:UIApplicationOpenSettingsURLString) { 
       UIApplication.sharedApplication().openURL(url) 
      } 
     } 
     alertController.addAction(openAction) 

     self.presentViewController(alertController, animated: true, completion: nil) 
} 
+0

Вам не нужно проверять SystemVersion перед добавлением действия Open Settings? –

0

Это то, что я сделал, учитывая предыдущие ответы: (это в MonoTouch C#, но легко переводимые в Swift или Obj-C)

Следующие запрашивают разрешение, а затем приступают к обновлению местоположения. В противном случае, в следующий раз, когда пользователь придет; если место службы отключены или запрещен экран будет выведено сообщение, чтобы запросить разрешение/активацию с перенаправлением к настройкам

//Location Manager (foreground) 
     CLLocationManager locMgr = new CLLocationManager(); 
     locMgr.PausesLocationUpdatesAutomatically = false; 

     if (UIDevice.CurrentDevice.CheckSystemVersion(8, 0)) 
     { 
      locMgr.RequestWhenInUseAuthorization(); 
     } 

     if (CLLocationManager.LocationServicesEnabled && CLLocationManager.Status == CLAuthorizationStatus.AuthorizedWhenInUse) 
     { 
      //set the desired accuracy, in meters 
      locMgr.DesiredAccuracy = 150; 
      locMgr.LocationsUpdated += (object sender, CLLocationsUpdatedEventArgs e) => 
      { 
       Console.WriteLine(e.Locations); 
      }; 

      locMgr.StartUpdatingLocation(); 
     } 
     else if (!CLLocationManager.LocationServicesEnabled || CLLocationManager.Status == CLAuthorizationStatus.Denied) 
     { 
      var alert = UIAlertController.Create(NSBundle.MainBundle.LocalizedString("Location access", "Location access"), NSBundle.MainBundle.LocalizedString("Please check location", "To show your position on the map, you have to enable location services and authorize the app"), UIAlertControllerStyle.Alert); 

      alert.AddAction(UIAlertAction.Create("Ok", UIAlertActionStyle.Cancel, null)); 

      if (UIDevice.CurrentDevice.CheckSystemVersion(8, 0)) 
      { 
       alert.AddAction(UIAlertAction.Create(NSBundle.MainBundle.LocalizedString("Go to settings", "Go to settings"), UIAlertActionStyle.Default, delegate 
       { 

        var url = new NSUrl(UIApplication.OpenSettingsUrlString); 
        UIApplication.SharedApplication.OpenUrl(url); 

       })); 
      } 

      PresentViewController(alert, true, null); 
     }