5

我正在创建一个应用程序,告诉用户他们是否在目的地附近。我正在计算currentLocation目的地和目的地之间的距离。我在里面做计算didUpdateLocations。它正在工作,但我已经看到有一些方法可以处理这个问题,而无需进行任何数学运算。

我正在注册该地区CLLocationManager;但是似乎这些方法didExitRegiondidEnterRegion没有被调用。

这是我注册区域的代码部分:

- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar
{
    [self.locationManager startUpdatingLocation];
    [self.mySearchBar resignFirstResponder];
    [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];

    self.distToRemind = 0;

    [worldMap removeAnnotations:[worldMap annotations]];
    NSLog(@"executou de primeira");

    CLGeocoder *geocoder = [[CLGeocoder alloc] init];
        [geocoder geocodeAddressString:[self.mySearchBar text] completionHandler:^(NSArray *placemarks, NSError *error)
         {
             CLPlacemark *placemark = [placemarks lastObject];

             //test
             //DefaultAnnotation *annot = [[DefaultAnnotation alloc] initWithCoordinate:placemark.location.coordinate andTitle:@""];
             CLRegion *newRegion = [[CLRegion alloc] initCircularRegionWithCenter:placemark.location.coordinate radius:10.0 identifier:@"RegionBoundary"];

             DefaultAnnotation *regionAnnotation = [[DefaultAnnotation alloc] initWithCoordinate:newRegion.center andTitle:@""];

             [self identifyPlacemark:placemark andSetAnnotation:regionAnnotation];

             MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(regionAnnotation.coordinate, 250, 250);


             [worldMap addAnnotation:regionAnnotation];
             [worldMap setRegion:region animated:YES];

             [self.locationManager startMonitoringForRegion:newRegion];

             if (self.boolPushButtonTapped) {
                  [self pushButtonTapped];
             }
         }
         ];
}

我在这里做错了吗?

4

1 回答 1

12

好的,在 iOS 中使用区域监控功能时要记住一些事项。

  • 无论您将初始半径设置为什么,区域都将默认为最小大小。一位 Apple 工程师告诉我,支持 GPS 的设备是 100M。450M 适用于仅支持区域监控的 Wifi 设备(iPad 3 和新的 iPod Touches)
  • 您可以监控的区域是有限的商品。单个设备可以监控的总数是有限的。再一次,一位苹果工程师告诉我它大约有 100 个地区。使用委托方法来确保您的区域添加好或坏。
  • 区域非常有用,对电池寿命的影响最小。他们还在状态栏中获得自己的位置图标。(空心紫色位置箭头)
  • 它们的工作方式与其他所有位置 API 非常相似,您需要正确响应委托方法以解释正在发生的操作。

您的代码看起来不错,但缺少围绕您的CLLocationManagerDelegate. 如果没有适当的委托来处理回调,您可能只是错过了回调 ( -didExitRegion/-didEnterRegion)。

根据我的经验,我创建了一个单例类来处理我的所有位置管理器委托方法。确保您注册以聆听他们的声音。如果您在这些委托调用周围包含更多代码,我很乐意为您提供更多帮助。有很多教程应该记录如何正确设置它们。祝你好运。

*注意:我今年在 WWDC 与一位定位工程师谈过关于最小区域大小和区域数量的许多未知数。我可以确认最小区域大小为 100,但不能确认最大区域数。我暂时还没有这个需求。

于 2012-10-04T21:25:25.673 回答