iOS 6的地理围栏技术

5

我正在创建一个应用程序,告诉用户他们是否接近目的地。 我正在计算当前位置和目的地之间的距离。 我在 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];
             }
         }
         ];
}

我这里有什么做错了吗?


您正在创建的区域仅有10米半径,您确定要进入和离开该区域吗? - Craig
我刚刚将它改成了200,虽然发送警报需要20分钟或更长时间。我该如何设置小数字?当我设置为20米时,我在该区域内,但当我走出该区域时,我没有收到警报,即使我已经走了超过200米。 - Camus
也许你可以设置一个20米的区域,然后触发应用程序开始使用 didUpdateLocations。我不确定你是否可以依赖 GPS 如此精确地知道何时你在目标物体10米范围内。用户是否在寻找一些如此微小的东西,以至于当他们距离10米时看不到它们存在? - Craig
不,我只是在想是否可能。谢谢。 - Camus
1个回答

12

好的,在iOS中使用区域监控能力时需要注意以下几点。

  • 无论您将初始半径设置为多少,区域默认都会缩小到最小尺寸。苹果公司的一名工程师告诉我,对于启用GPS的设备而言,最小尺寸是100米。对于仅支持区域监控的Wifi设备(iPad 3和新款iPod Touch),最小尺寸为450米。
  • 您可以监控的区域数量有限。单个设备可以监控的总数是有限的。同样,苹果公司的一名工程师告诉我,大约是100个区域。使用委托方法确保您的区域已经被添加或者未被添加。
  • 区域非常有用,对电池寿命的影响也很小。它们在状态栏中拥有自己的位置图标。(空心紫色定位箭头)
  • 它们的工作方式与其他所有位置API非常相似,您需要正确地响应委托方法来解释正在发生的操作。

您的代码看起来不错,但缺少处理CLLocationManagerDelegate的逻辑。如果没有一个正确的委托来处理回调,您可能会错过回调(-didExitRegion/-didEnterRegion)。

根据我的经验,我创建一个单例类来处理所有的位置管理器委托方法。确保注册以便监听它们。如果您包含一些关于这些委托调用的更多代码,我很乐意为您提供更多帮助。有很多教程可以告诉您如何正确设置它们。祝好运。

*注意:我在今年的WWDC上与一位定位工程师谈论了许多关于最小区域大小和区域数量的未知问题。我可以确认最小区域大小为100,但是最大区域数量尚不确定。截至目前,我还没有这方面的需求。


感谢详细的解释。在我的情况下,这是我的第一个应用程序,我每次只会设置一个区域。我在mapViewController中实现了didExitRegion和didEnterRegion方法,也许创建一个单独的类来处理这个会更清晰。我设置了200米,虽然不是非常精确,但它可以工作。我在didUpdateLocation中自己稳定了区域,做了一些数学计算,效果非常精确。你认为这样做是个坏主意吗? - Camus
这取决于你的使用情况。你拥有的位置越精确,你在实际应用中的准确性就会越高。这可能仅与提取位置和模拟器中的详细程度有关。我认为我的经度/纬度精度为5位数,测试时很少出现问题。很高兴你能够启动并运行。 - Bill Burgess
谢谢。你的意思是使用一些数学方法可能比委托方法更好吗? - Camus
我不确定你需要数学做什么。如果你觉得需要,可以用。区域监控的委托方法只会在你穿过区域边界时给你更新。之后你要做什么就取决于你了。 - Bill Burgess
谢谢,伙计。我有关于同一问题的另一个问题要问。如果你能看一下,我会很感激。 - Camus
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接