当前位置: 首页 > 知识库问答 >
问题:

CLLocationManager从不向用户询问位置服务

魏兴邦
2023-03-14

我有一个IOS 8-only应用程序,我想在其中使用位置服务获取设备的纬度和经度。我认为我已经正确地实现了所有功能,但应用程序从未询问用户是否可以使用位置服务,CLAuthorizationStatus从未从kCLAuthorizationStatusNotDetermined和CLLocationManager委托方法更改

- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading 

从未接到过电话。

下面是在视图控制器的接口文件中定义的CLLocationManager:

__strong CLLocationManager *locationManager;

这是视图控制器中的代码:

- (void)viewDidLoad{
    [super viewDidLoad];

    locationManager = [[CLLocationManager alloc] init];
    locationManager.delegate = self;
    CLAuthorizationStatus status = [CLLocationManager authorizationStatus];
    if (status == kCLAuthorizationStatusNotDetermined) {
        [locationManager requestWhenInUseAuthorization];
    }
    [locationManager startUpdatingLocation];
    //... other viewDidLoad code
}

信息。应用程序的plist文件有一个NSLocationWhenUsageDescription条目。

调试跟踪显示该行

[locationManager requestWhenInUseAuthorization];

已执行,但请求用户确认位置服务的对话框未显示。

此应用程序中的位置服务在iOS 7下正常工作-我显然做错了什么,或者没有做一些我需要做的事情,以使其在iOS 8下正常工作。但我一直在四处寻找真知灼见,在我看来,似乎我做的每件事都是正确的。

任何想法和/或建议?提前感谢。

共有3个答案

罗伟志
2023-03-14

我找到了解决办法,虽然我不知道为什么。我意识到我有重复的信息。plists位于应用程序文件夹的不同文件夹中。这两个信息。plists看起来完全相同,都与nsLocationWhenUsageDescription条目相同。但当我删除了应用程序导航窗口中未提及的应用程序时,该应用程序开始像广告中所宣传的那样工作:获得了请求警报、允许的位置服务和标题开始更新。不知道为什么会有相同的重复信息。plist不包括在应用程序的构建中,会导致这个问题,但似乎是这样。

舒浩邈
2023-03-14

首先,检查CLLocationManagerDelegate是否定义,然后执行以下操作。

NSString *systenversion=[[UIDevice currentDevice] systemVersion];

    if ([systenversion integerValue]>=8.0) {

        if ([locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) {
            [locationManager requestAlwaysAuthorization];
        }
    }
    [locationManager startUpdatingLocation];

代表们,

- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
{
    NSLog(@"didFailWithError: %@", error);
    UIAlertView *errorAlert = [[UIAlertView alloc]
                               initWithTitle:@"Error" message:@"Failed to Get Your Location" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
    [errorAlert show];
}

- (void)locationManager:(CLLocationManager*)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status
{
    switch (status) {
        case kCLAuthorizationStatusNotDetermined: {
            NSLog(@"User still thinking..");
        } break;
        case kCLAuthorizationStatusDenied: {
            NSLog(@"User hates you");
        } break;
        case kCLAuthorizationStatusAuthorizedWhenInUse:
        case kCLAuthorizationStatusAuthorizedAlways: {
            [locationManager startUpdatingLocation];//Will update location immediately

            [self showAlertWithTitle:@"Success" andMessge:@"Success to get current location"];
        } break;
        default:
            break;
    }
}

希望这能奏效。:)

谭铭
2023-03-14

你很接近。让我看看能不能帮上忙。对于iOS 8,您需要首先调用:

[self.locationManager requestWhenInUseAuthorization];

我建议您在代码行后面加上这句话:locationManager。代表=自我(然后删除viewDidLoad方法中的所有其他内容)。这与iOS 7不同,因为它包含了所有新的隐私内容。在调用此方法的委托回调之前,不要调用startUpdatingLocation。如果阅读文档,您将看到方法requestwhenuseauthorization,完成后调用其回调方法:

locationManager:didChangeAuthorizationStatus:

在回调方法中,检查状态并根据该值采取行动。这就是我的方法的样子:

- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status
{
    if(status == kCLAuthorizationStatusAuthorized || status == kCLAuthorizationStatusAuthorizedWhenInUse)
    {
        [self.locationManager startUpdatingLocation];
    }
}

请记住,您不会每次都看到询问应用程序是否可以使用您的位置的警报。你看过一次以后,它就不会再出现了。然后,用户可以控制应用程序是否可以访问他/她在设备设置应用程序中的位置。

 类似资料:
  • 问题内容: 我对使用Firebase及其位置库GeoFire感到很陌生。目前,我在构造数据时遇到一些问题。 目前,我的数据库是这样的: 我想查询当前登录用户附近的用户。为此,我无法理解必须指定的路径。 目前,我正在这样做(但这不起作用): 保存当前位置 检索附近的其他用户 更新 保存当前位置 检索附近的其他用户 问题答案: 对于GeoFire,您必须在仅包含地理位置的树中保留一个分段,然后在树中保

  • 注册WhatsApp时,您需要输入您的电话号码。WhatsApp已经知道(不知何故)您所在的国家,并为您预先选择了该国家,因此您只需确认即可。 有鉴于此,whatsapp没有要求获得访问您所在位置的许可,但他们仍然知道(可能是含糊不清)。这是怎么回事?

  • 我们试图在wifi禁用时测试应用程序的优先级高精度和位置更新。 如果用户在没有wifi网络可用的地方移动,也会出现同样的问题。 我认为正确的行为是使用其他手机传感器(如GPS)更新位置,如果手机不能更新位置与WiFi。 你能提供什么工作? 我们不想使用优先高精度,因为它会耗尽手机电池。我们的应用程序跟踪手机位置,它不应该取决于wifi设置和wifi网络可用性。

  • 我有多个应用程序实例,根据位置使用不同的Azure应用服务计划。是否可以根据用户的位置将其重定向到不同的应用服务实例?(即来自西班牙的用户将被重定向到西欧应用服务,而来自美国的用户将被重定向到北美应用服务实例)。

  • 我不需要精确的位置数据,也不希望用户看到“此应用程序想要确定您的位置”警报。我只需要确定用户的国家,假设他们通过网络或wi-fi连接互联网。 最好的方法是什么?有没有办法使用他们的IP? 这只有在他们有承运人的情况下才有效: 而且不可靠,因为用户可以在设备设置中更改它。出于同样的原因,无法使用设备的语言设置。我需要基于他们实际所在地的国家。

  • 我需要每1分钟和每5米位移更新一次熔合位置(我知道这是一个错误的做法,但为了测试和在日志中显示),并且我在按下按钮后立即启动服务,我在logcat中获得位置,但只有一次。根据服务级别,onLocationChanged应该每1分钟调用一次,但它不会再次调用,即使我的GPS几乎每分钟打开一次,然后在之后关闭,但Logcat中仍然没有位置更新。我需要服务类来保持更新位置,而不影响UI或主线程 这是只显