iphone再次询问当前位置许可

时间:2013-06-21 06:36:41

标签: iphone ios ios6 cllocationmanager

案例:对于当前位置,用户在应用安装上选择“不允许”,那么有没有办法可以再次询问用户位置并触发当前位置的本机iphone警报?

我在stackoverflow上看到了一些帖子,但是现在还有一个解决方案,现在可以在新的sdk或有人找到方法中调用,

帖子提到: CLLocation ask again for permission

5 个答案:

答案 0 :(得分:9)

不幸的是你做不到。您可以做的一件事是提示用户更改位置设置。

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 :(得分:7)

在ios8中,apple引入了一个UIApplicationOpenSettingsURLString常量,它是设备“设置”视图的位置。

您可以编写以下代码(在swift中)以将用户定向到设置视图:

public static void main(String[] args) {
    int input = 145689; // Taking an integer
    String string = Integer.toString(input); //Converting to string
    for(char c: string.toCharArray()) //Putting them inside a character array
    System.out.println(c);  

}

答案 2 :(得分:5)

似乎接受的答案并非完全正确。 [CLLocationManager locationServicesEnabled]检查是否已启用位置服务,如文档中所述。

  

返回一个布尔值,指示是否在设备上启用了位置服务。   用户可以通过切换“常规”中的“位置服务”开关,从“设置”应用程序启用或禁用位置服务。   您应该在开始位置更新之前检查此方法的返回值,以确定用户是否为当前设备启用了位置服务。位置服务在用户第一次尝试在应用程序中使用与位置相关的信息时会提示用户,但不会提示后续尝试。如果用户拒绝使用位置服务,并且您仍尝试启动位置更新,则位置管理器会向其代理报告错误。

如果您想检查是否允许用户使用他/她的位置,您应该检查[CLLocationManager authorizationStatus]。如果您的应用的状态为kCLAuthorizationStatusDenied,则表示用户在要求获得许可时明确拒绝了您的应用。您可以使用它并相应地通知用户。

答案 3 :(得分:0)

我认为没有办法再次询问位置许可。但是,如果您确实需要用户位置,那么您可以显示警告,指示他们从设置中启用它。

答案 4 :(得分: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);
        }