【问题标题】:iOS: Why does "Turn on Location Services" alert show twice upon startup?iOS:为什么“打开定位服务”警报在启动时显示两次?
【发布时间】:2012-01-23 13:38:04
【问题描述】:

当我禁用位置服务时,此警报会显示两次。第一次是没有显示位置管理器用途属性。紧接着(在触摸第一个警报按钮之前),它再次显示,这次包含了目的属性。

当第二个警报被解除时,第一个警报仍然存在。

这有点烦人,我希望它会让用户感到困惑。

我该怎么做才能只显示一次,使用目的属性?

【问题讨论】:

  • 您能否提供一些实际代码来帮助我们为您提供更多帮助?
  • 首先我只想知道这是典型行为还是不正常?如果不正常,我会再四处寻找,看看可能是什么原因造成的。我没有玩太多禁用位置服务的游戏,所以这对我来说是新的。
  • 这不是默认行为,很可能你做错了什么。请发布一些代码你是如何使用位置管理器的?
  • 我发现了问题。一旦你确认这是不正常的。我将在下面的答案中发布发生的事情,以防其他人可能感兴趣。谢谢。

标签: ios cllocationmanager


【解决方案1】:

我在我的应用委托中实例化了一个地图控制器对象和一个位置管理器对象。

mapController = [[[MapController alloc] initWithFrame:CGRectMake(0, 0, 0, 0)] retain];
[self restartLocationManager];

但是,在此代码中实例化位置管理器之前,不会设置位置管理器用途属性:

- (void) restartLocationManager {
    if (locationManager)
        [locationManager release];

    locationManager = [[[CLLocationManager alloc] init] retain];
    locationManager.purpose = NSLocalizedString(@"Location Service Purpose", nil);
    locationManager.distanceFilter = kCLDistanceFilterNone; 
    locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters; 
    [locationManager startUpdatingLocation];
}

所以这是地图初始化中的某些东西触发了第一个警报的线索。

因为我拒绝在第一个警报中打开位置服务,所以地图控制器已初始化并看到需要显示警报。地图控制器初始化是这样的(它是单例的一部分,在这方面需要一些清理,但忽略...):

- (id) initWithFrame:(CGRect)aFrame {
    @synchronized(self) {
        if (!theMap) {
            if (!self) self = [super init];

            theMap = [[[MKMapView alloc] initWithFrame:aFrame] retain];
            theMap.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
            theMap.showsUserLocation = YES;
            theMap.delegate = self;
    }
    return self; 

}

单步执行代码时,我看到在执行showUserLocation 行时出现了第二个警报。我必须做更多的测试才能准确地缩小范围,但我认为我现在走在正确的轨道上。

【讨论】:

  • 我遇到了类似的问题,但我终生无法弄清楚是什么触发了警报。除非已为该应用程序授权定位服务,否则我不会开启重大变更监控。对我有什么建议吗?老实说,警报似乎很随机。
猜你喜欢
  • 1970-01-01
  • 2015-09-11
  • 2017-01-17
  • 1970-01-01
  • 1970-01-01
  • 2014-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多