iOS:为什么“启用位置服务”警报会在启动时显示两次?

时间:2012-01-23 04:25:08

标签: ios cllocationmanager

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

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

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

我只能用目的属性显示一次?

1 个答案:

答案 0 :(得分:0)

我在我的app delegate中实例化了一个地图控制器对象和一个位置管理器对象。

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行时出现第二个警报。我将不得不做更多的测试来缩小范围,但我认为我现在正走在正确的轨道上。