如何在iOS中检查CLLocation的有效性

Bry*_*yan 7 cocoa-touch objective-c core-location ios

如何检查CLLocationiOS的有效性?

事实上,这是我的情况,

我只是创建一个新地图

mapView = [[MKMapView alloc] initWithFrame:CGRectMake(10, 30, 300, 380)];
mapView.showsUserLocation = YES;
[mapView setDelegate:self];
Run Code Online (Sandbox Code Playgroud)

然后我想检查用户位置的有效性

mapView.userLocation.location 
Run Code Online (Sandbox Code Playgroud)

由于在使用用户位置时出现此错误

'NSInvalidArgumentException', reason: 'Invalid Coordinate -180.00000000, -180.00000000'
Run Code Online (Sandbox Code Playgroud)

提前谢谢〜

小智 10

作为Abizern的评论暗示,你不应该承担的位置将准备设置后立即使用showsUserLocationYES.

当位置可用时,地图视图将调用其委托方法didUpdateUserLocation.
(如果获取位置失败,didFailToLocateUserWithError将调用委托方法.)

didUpdateUserLocation方法之外,这里有几种方法可以检查位置是否可以使用:

  • 检查是否userLocation.locationnil.如果是,则尚未获得该位置,它失败了,或者showsUserLocationNO.
  • 如果位置不是nil,那么您可以查看coordinate属性,并且可以使用该CLLocationCoordinate2DIsValid函数检查(如果您认为它可能无效).但请注意,坐标0,0有效(这通常发生在位置为零时).

我注意到即使在didUpdateUserLocation委托方法中,userLocation.location也可以nil.

这似乎是第一次运行应用程序和设置后showsUserLocation 发生的YES.此时,iOS会提示用户"允许应用使用您的位置?" 同时调用委托(即使用户尚未响应提示并且尚未确定位置).

因此,在该委托方法的顶部,您还应该检查是否userLocation.locationnil.


顺便说一句,在您的代码中,您可能希望在设置之前设置委托showsUserLocation.


why*_*yoz 6

基于Anna K的解释,检查CLLocationCoordinate2DIsValid(YOURLOCATION)的有效性是一般的好习惯.

如果您从Web服务或SQLite数据库获得拉伸和长期,则应在尝试向地图添加注释之前检查并确保该位置有效.以下是此操作的示例:

for (int i = 0; i < [yourArray count]; i++) {

    YourOBJ *obj = [yourArray objectAtIndex:i];

    yourCLLocation2D.latitude = obj.latitude;
    yourCLLocation2D.longitude = obj.longitude;

    AnnotationPin *anno = [[AnnotationPin alloc] initWithCoordinate: yourCLLocation2D];

    if (CLLocationCoordinate2DIsValid(yourCLLocation2D))
    {
        anno.lat = obj.latitude;//Maybe you want to store lat
        anno.lon = obj.longitude;//and lon
        anno.title = obj.name//define the title
        anno.subtitle = obj.info//and subtitle for your annotation callout
        anno.yourLocation = yourCLLocation2D;//Some of these aren't necessary
        anno.tag = i;//but can really help to define and track pins

        [map addAnnotation:anno];
    }

    [anno release];
}
Run Code Online (Sandbox Code Playgroud)

对于所有遇到问题的人,如果成功地将一堆引脚添加到地图中,并且使用相同的代码尝试添加另一组引脚但应用程序崩溃,请尽快尝试.对于那些在这个例子中有类似情况但没有遇到任何问题的人,无论如何都要这样做!如果您为其提供该功能,您的用户可能会添加不正确的lat/lon组合并使应用程序崩溃.

请记住,(0,0)是一个有效的坐标,所以如果你担心这一点,不要担心这个逻辑删除它们.这适用于那些在地球上没有物理存在的(-200,75)类型坐标.