2013-06-21 26 views
6

Trường hợp: Đối với vị trí hiện tại, người dùng đã chọn "Không cho phép" khi cài đặt ứng dụng, có cách tôi có thể hỏi lại vị trí người dùng và kích hoạt cảnh báo iphone gốc cho vị trí hiện tại ??iphone yêu cầu quyền vị trí hiện tại một lần nữa

Tôi nhìn thấy một số bài viết trên stackoverflow nhưng có cũ, có một giải pháp hiện nay để gọi trong sdk mới hoặc một người nào đó tìm ra cách,

bài viết giới thiệu: CLLocation ask again for permission

+2

vẫn không có cách nào nếu người dùng chọn "cho phép" hoặc "từ chối", chỉ một lần thay đổi cho mỗi ứng dụng cài đặt – adali

Trả lời

8

Rất tiếc, bạn không thể làm điều đó. Một điều bạn có thể làm là nhắc người dùng thay đổi cài đặt vị trí.

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

tôi đã làm điều này, nhưng các khách hàng u biết, muốn tất cả mọi thứ họ có trong tâm trí của họ: | –

+0

tốt đẹp :) tốt hơn bạn nên nói với tình hình và đó là lợi thế cho khách hàng. – manujmv

0

Tôi không nghĩ rằng có là cách để yêu cầu quyền vị trí một lần nữa. Nhưng nếu bạn thực sự cần vị trí người dùng thì bạn có thể hiển thị cảnh báo hướng dẫn họ bật tính năng này từ cài đặt.

5

Có vẻ như câu trả lời được chấp nhận không hoàn toàn đúng. [CLLocationManager locationServicesEnabled] kiểm tra xem dịch vụ vị trí có được bật hay không, như được mô tả trong tài liệu.

Trả về giá trị Boolean cho biết liệu dịch vụ vị trí có được bật trên thiết bị hay không. Người dùng có thể bật hoặc tắt dịch vụ vị trí từ ứng dụng Cài đặt bằng cách chuyển đổi chuyển đổi Dịch vụ vị trí nói chung. Bạn nên kiểm tra giá trị trả về của phương pháp này trước khi bắt đầu cập nhật vị trí để xác định liệu người dùng có bật dịch vụ vị trí cho thiết bị hiện tại hay không. Dịch vụ vị trí nhắc người dùng lần đầu tiên họ cố gắng sử dụng thông tin liên quan đến vị trí trong một ứng dụng nhưng không nhắc các lần thử tiếp theo. Nếu người dùng từ chối việc sử dụng dịch vụ vị trí và bạn cố bắt đầu cập nhật vị trí, trình quản lý vị trí sẽ báo cáo lỗi cho đại biểu của nó.

Nếu bạn muốn kiểm tra xem người dùng có được phép bạn sử dụng vị trí của họ hay không, bạn nên kiểm tra [CLLocationManager authorizationStatus]. Nếu trạng thái cho ứng dụng của bạn là kCLAuthorizationStatusDenied, điều đó có nghĩa là người dùng đã từ chối ứng dụng của bạn một cách rõ ràng khi được yêu cầu quyền. Bạn có thể sử dụng điều này và thông báo cho người dùng tương ứng.

5

trong ios8, apple đã giới thiệu một hằng số UIApplicationOpenSettingsURLString là vị trí của chế độ xem "cài đặt" của thiết bị.

bạn có thể mã hóa như sau (trong nhanh chóng) chuyển hướng người dùng đến giao diện cài đặt:

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

Bạn không phải kiểm tra SystemVersion trước khi thêm hành động Open Settings? –

0

Đây là những gì tôi đã làm xét câu trả lời trước: (đây là trong MonoTouch C# nhưng dễ dàng thể dịch để Swift or Obj-C)

Sau đây yêu cầu quyền và sau đó tiến hành cập nhật vị trí nếu được cấp. Nếu không, lần sau người dùng sẽ đến; nếu dịch vụ vị trí bị tắt hoặc bị từ chối, dịch vụ vị trí sẽ hiển thị thông báo để yêu cầu quyền/kích hoạt bằng cách chuyển hướng đến cài đặt

//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); 
     } 
Các vấn đề liên quan