3

アプリで位置監視を使用しようとしています。自分の場所を設定し、監視したい場所をリバースジオコーディングできます。didUpdateToLocationデリゲート メソッドは正常に動作し、継続的に更新されますが、デリゲートdidStartMonitoingForRegionが呼び出されることはありdidExitRegionませんdidEnterRegion

助言がありますか?

- (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);
    }
}];  
 }
4

1 に答える 1

0

シミュレーターを使用してアプリケーションをテストしていますか? 私が見つけたのは、シミュレーターが領域の出入りに対して完全に信頼できないということです。デバイスをプラグインし、iPhone シミュレーターから iOS デバイスに変更して、デバイスでプロジェクトをコンパイルしてみてください。次に、デバイスのプラグを抜き、スマートフォンからアプリを実行してテストできます。

地域でシミュレーターが機能しないのはなぜですか? 地域は、ほとんどの場合、Wi-Fi、携帯電話基地局、および位置情報を要求する電話のその他のアプリケーションを使用する Apple の隠しアルゴリズムによって決定されます。シミュレーターが Wi-Fi や携帯電話基地局を使用していないことを考えると、地域の監視はかなり不可能になるでしょう。

あなたのコードは問題ない可能性があります (明らかなエラーは見られません) が、シミュレーターは悪い結果を示しています。お使いのデバイスで試してみて、同じことができるかどうかお知らせください。

于 2012-08-03T17:22:31.363 に答える