未调用 CLLocation Manager didStartMonitoringForRegion 委托方法

Posted

技术标签:

【中文标题】未调用 CLLocation Manager didStartMonitoringForRegion 委托方法【英文标题】:CLLocation Manager didStartMonitoringForRegion delegate method not called 【发布时间】:2012-06-19 03:03:29 【问题描述】:

我正在尝试在我的应用中使用位置监控。我可以设置我的位置并反向地理编码我想要监控的位置。 didUpdateToLocation 委托方法工作正常,并且不断更新,但 didStartMonitoingForRegion 委托永远不会被调用,didExitRegiondidEnterRegion 也不会被调用。

有什么建议吗?

- (IBAction)setLocation:(UIButton *)sender 
    if(!self.locationManager) self.locationManager = [[CLLocationManager alloc] init];
    [self.locationManager setDelegate:self];
    [self.locationManager setDesiredAccuracy:kCLLocationAccuracyBest];
    [self.locationManager setDistanceFilter:10];  // Update again when a user moves     distance in meters

    [self.locationManager setPurpose:@"Set location based alerts if switch is on"];
    self.plugLocation=nil; //reset to nil so didUpdateToLocation will update it
    self.distanceLabel.text=[NSString stringWithFormat:@"%d",0];

    [self.locationManager startUpdatingLocation];


    if ( ![CLLocationManager regionMonitoringAvailable] || ![CLLocationManager regionMonitoringEnabled] )
        NSLog(@"Location monitoring not  Unavailable");
    else 

    

-(void)setPlugLocation:(CLLocation *)plugLocation
    //
    if (!_plugLocation) _plugLocation=[[CLLocation alloc]init];
        _plugLocation=plugLocation;
    if (_plugLocation) 
        [self setRegion:plugLocation radius:20 name:self.plugName];
        [self reverseGeocode:self.plugLocation];
         NSLog(@"setPlugLocation %@", [self.plugLocation description]);
            


 -(void)setRegion:(CLLocation *)center radius:(double)meters name:(NSString*)name
     CLLocationCoordinate2D plug2D;
     plug2D.latitude=center.coordinate.latitude;
     plug2D.longitude=center.coordinate.longitude;
     CLRegion *region = [[CLRegion alloc] initCircularRegionWithCenter:plug2D radius:meters identifier:name];
     [self.locationManager startMonitoringForRegion:region      desiredAccuracy:kCLLocationAccuracyBest]; 
 

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation    
    self.latitudeLabel.text=[NSString stringWithFormat:@"%f",newLocation.coordinate.latitude];
    self.longitudeLabel.text=[NSString stringWithFormat:@"%f",newLocation.coordinate.longitude];

    if (self.plugLocation == nil)self.plugLocation = newLocation;
    if (self.plugLocation!=nil) 
    CLLocationDistance distanceBetween = [newLocation distanceFromLocation:self.plugLocation];
     NSLog(@"didUpdateToLocation Distance from plug=%f",distanceBetween);
    self.distanceLabel.text=[NSString stringWithFormat:@"%f",distanceBetween];
    


 -(void)reverseGeocode:(CLLocation *)coordinates;
     if (!self.plugGeo) self.plugGeo = [[CLGeocoder alloc] init];
[self.plugGeo reverseGeocodeLocation:coordinates completionHandler:^(NSArray *placemarks, NSError *error) 
    if (error==nil&&[placemarks count]>0) 
        CLPlacemark *placemark=[placemarks objectAtIndex:0];
        NSLog(@" setPlugLocation geocodeAddressString %@",placemark);
        //should also transfer back to plug detail and save
        self.locationLabel.text=[NSString stringWithFormat:@"%@ %@\n%@, %@", placemark.subThoroughfare,  placemark.thoroughfare, placemark.locality,placemark.postalCode];
        [self sendAlertMessage:[NSString stringWithFormat:@"%@ %@\n%@, %@", placemark.subThoroughfare,  placemark.thoroughfare, placemark.locality,placemark.postalCode] title:@"Success"];
    else 
        NSLog(@" setPlugLocation couldn't geoCode address %@",error);
    
];  
 

【问题讨论】:

【参考方案1】:

您是否使用模拟器来测试您的应用程序?我发现模拟器对于区域退出/进入完全不可靠。尝试通过将项目插入并从 iPhone Simulator 更改为您的 ios 设备来在您的设备上编译项目。然后,您可以拔下设备并从手机上运行您的应用程序进行测试。

为什么模拟器不适用于区域?区域主要由 Apple 的隐藏算法确定,该算法使用 Wi-Fi、手机信号塔和手机上请求位置的其他应用程序。将模拟器视为不使用 Wi-Fi 或手机信号塔...区域监控几乎是不可能的。

您的代码可能很好(我没有看到明显的错误),但模拟器给您的结果很糟糕。在您的设备上试一试,如果效果相同,请告诉我们。

【讨论】:

该应用程序在我的手机上运行良好,尽管它仍然偶尔会错过地理围栏交叉点。然而,当我设置一个新的“围栏”时,我很少看到对 didStartMonitoingForRegion 的调用,即使它正确调用了更新。

以上是关于未调用 CLLocation Manager didStartMonitoringForRegion 委托方法的主要内容,如果未能解决你的问题,请参考以下文章

iOS - CLLocation Manager didUpdateLocations 在一个类中被调用,而不是在另一个类中?

CLLocation didupdatetolocation 未调用

CLLocation Manager如何在一定距离后更新

CLLocation Manager 有时会给出不正确的位置

CLLocation Manager 检查 requestAlwaysAuthorization 如果不接受退出应用

CLLocation Manager 使用默认位置而不是使用实际位置进行更新