MKErrorDomain错误4 iPhone

时间:2010-10-13 17:10:04

标签: iphone mkreversegeocoder

当我运行我正在构建的gps应用程序时,我会随机获取此信息。它不会每次都发生,并且传入的坐标始终有效(我会记录它们)。这些地方有文件吗?

编辑:

CLLocationCoordinate2D coord = CLLocationCoordinate2DMake(locManager.location.coordinate.latitude, locManager.location.coordinate.longitude);
geocoder1 = [[MKReverseGeocoder alloc] initWithCoordinate:coord];
geocoder1.delegate = self;
[geocoder1 start];

然后大约一半时间返回错误。如果出现错误,我尝试释放并重新分配地理编码器,但这没有帮助。唯一能做的就是重新启动应用程序。

6 个答案:

答案 0 :(得分:11)

在MapKit框架中的“MKTypes.h”中,定义了以下内容:

Map Kit框架的错误常量。

enum MKErrorCode {
   MKErrorUnknown = 1,
   MKErrorServerFailure,
   MKErrorLoadingThrottled,
   MKErrorPlacemarkNotFound,
};

...

<强> MKErrorPlacemarkNotFound

找不到指定的地标。

这听起来好像是在代码中引用了一些未知的地标?或者可能是Google没有您要传递的位置的名称 - 但坐标可能有效。

答案 1 :(得分:5)

我最近遇到并解决了这个问题。在我的情况下,当Apple Map找不到查询的任何结果时,它有时会抛出这个“MKErrorDomain = 4”错误。所以我最终只是将其视为“未找到结果”。

找到这个是很费劲的,MapKit需要一个更好的错误处理系统。

答案 2 :(得分:3)

我一直在反复这个错误,并且无法弄清楚如何让它停止;但是我终于发现整个问题的最终结果非常有效,而且只需要多做一些工作:不要使用Apple的MKReverseGeocoder - 而是直接调用Google's reverse-geocoding API(这个显然是MKReverseGeocoder在幕后做的服务。您可以返回JSON或XML(您的首选项),然后您必须解析它,但这不是太难。

例如,由于我的应用程序正在使用ASIHTTPRequest,这就是它的样子(尽管使用Apple的本机API(如NSURLConnection)也很容易做到这一点:

#pragma mark -
#pragma mark CLLocationManagerDelegate

- (void)locationManager:(CLLocationManager *)manager 
    didUpdateToLocation:(CLLocation *)newLocation 
           fromLocation:(CLLocation *)oldLocation
{
    // Be careful: My code is passing sensor=true, because I got the lat/long
    // from the iPhone's location services, but if you are passing in a lat/long
    // that was obtained by some other means, you must pass sensor=false.
    NSString* urlStr = [NSString stringWithFormat:
      @"http://maps.googleapis.com/maps/api/geocode/xml?latlng=%f,%f&sensor=true",
      newLocation.coordinate.latitude, newLocation.coordinate.longitude];
    NSURL* url = [NSURL URLWithString:urlStr];
    self.reverseGeocoderRequest = [ASIHTTPRequest requestWithURL:url];
    self.reverseGeocoderRequest.delegate = self;
    [self.reverseGeocoderRequest startAsynchronous];
}

顺便说一句,谷歌的API有规则,就像苹果公司一样。请务必阅读文档,特别是关于配额。

答案 3 :(得分:2)

我遇到了同样的事情(完全相同的代码有时会随机失败),我想我找到了答案。来自Apple's developer docs:“每个Map Kit应用程序都具有有限的反向地理编码容量,因此谨慎使用反向地理编码请求对您有利。”

所以我的理论是,我们得到了速率限制...因为没有其他变量正在改变(即我的代码没有改变,我在模拟器上运行它所以设备的位置不是变化等)我认为这一定是唯一剩下的原因。

答案 4 :(得分:1)

我刚刚完成了对这个问题的大量研究,似乎不在我们手中。我查看了开发人员论坛以及Stack和其他地方的所有内容,除了使用其他服务之外,没有人有解决方案。关于这个问题,https://devforums.apple.com/message/154126有一个非常好的主题。

有些人在一段时间后发现错误,我发现它已经出现了一段时间然后又回来了。我查看了“当前地址”示例代码,我看不出我怎么搞砸了。我运行了示例代码,果然,这是NSLogging错误,而不是返回一个位置。

此链接包含一些使用Google反向地理编码器的代码:http://www.iphonedevsdk.com/forum/iphone-sdk-development/31883-pbrequestererrordomain-errors-reverse-geocoding.html#post155793

答案 5 :(得分:0)

实际上,我也遇到了这个问题。代码非常紧凑

  

// 1。询问当前坐标的地图

     

CLLocationCoordinate2D userLocation;

     

userLocation.latitude = [[_ theMapView.userLocation location] coordinate] .latitude;      userLocation.longitude = [[_ theMapView.userLocation location]坐标] .longitude;

     

NSLog(@“%f,%f”,userLocation.latitude,userLocation.longitude);

     

// 2。反向地理编码坐标

     

MKReverseGeocoder * reverseGeocoder = [[MKReverseGeocoder alloc]                         initWithCoordinate:用户位置];

     

[reverseGeocoder setDelegate:self];

     

[reverseGeocoder start];

以后只是NSLog失败委托方法中的错误。它第一次或第二次工作,然后停止工作