Как бороться с ошибками MKReverseGeocoder / PBHTTPStatusCode=503 в iOS 4.3?

Начиная с iOS 4.3 (GM Seed 10M2518) я получаю сбои при использовании MKReverseGeocoder, reverseGeocoder:didFailWithError: довольно часто вызывается с такой ошибкой:

Error Domain=NSURLErrorDomain Code=-1011 "The operation couldn’t be completed. (NSURLErrorDomain error -1011.)" UserInfo=0x339900 {PBHTTPStatusCode=503}

Приложение имеет тенденцию падать в эти моменты. Это не имело место в предыдущих версиях iOS.

Есть идеи, что случилось?

6 ответов

Решение

Убедитесь, что вы не освободили обратный геокодер преждевременно при ошибке:

изменения [_reverseGeocoder release] в [_reverseGeocode autorelease] в -(void)reverseGeocoder:(MKReverseGeocoder *)geocoder didFailWithError:(NSError *)error исправил проблему для меня.

Google не позволяет одному устройству получать свое местоположение более одного раза в течение 60 секунд, следовательно, работает с другим методом (вместо http-запроса, требуется JSON), когда (MKReverseGeocoder *) геокодер didFailWithError.

Он работает для меня на 4.3.3 (3GS) и тестируется 30-40 раз подряд, восстанавливая местоположение пользователя без сбоев, надеюсь, это поможет!

- (void) retrieveCurrentLoc {
self.geoCoder =
[[[MKReverseGeocoder alloc] initWithCoordinate:newLocation.coordinate] autorelease];
    geoCoder.delegate = self;

    [geoCoder start];
}

- (void)reverseGeocoder:(MKReverseGeocoder *)geocoder didFailWithError:(NSError *)error{

NSString *fetchURL = [NSString stringWithFormat:@"http://maps.google.com/maps/geo?    q=%@,%@&output=json&sensor=true", [NSString     stringWithFormat:@"%f",mapView.userLocation.location.coordinate.latitude], [NSString      stringWithFormat:@"%f",mapView.userLocation.location.coordinate.longitude]];
    NSURL *url = [NSURL URLWithString:fetchURL];
    NSString *htmlData = [NSString stringWithContentsOfURL:url];

SBJsonParser *parser = [[SBJsonParser alloc] init];
NSDictionary *json = [parser objectWithString:htmlData error:nil];
NSArray *placemark = [json objectForKey:@"Placemark"];
if ([[[[[placemark objectAtIndex:0]     objectForKey:@"AddressDetails"]objectForKey:@"Country"]objectForKey:@"Thoroughfare"]objectFor  Key:@"ThoroughfareName"] != NULL){
    currentAddress = [[[[[placemark objectAtIndex:0]     objectForKey:@"AddressDetails"]objectForKey:@"Country"]objectForKey:@"Thoroughfare"]objectFor  Key:@"ThoroughfareName"];}
else {
    currentAddress = [[placemark objectAtIndex:0] objectForKey:@"address"];
    }
}

Та же самая проблема здесь, мы проверили различные решения и не работали. Код ответа 503 по-разному обрабатывается предыдущей ОС, вы можете легко заметить это, прослушивая трафик iPhone.

Приложения, использующие MKReverseGeocoder (например, Gowalla), будут оказывать некоторое давление на Apple ... поэтому я ожидаю, что в эти дни выйдет исправление 4.3.1. Или Google, чтобы изменить их SLA с запросами Apple.

Вероятно, вы останавливаете менеджер местоположений, прежде чем геокодер найдет метку. Сделайте это в didFindPlacemark или для ошибки

Исходя из ответа zippo77, я нашел лучшие результаты при установке делегата MKReverseGeocoder равным nil первым в -(void)reverseGeocoder:(MKReverseGeocoder *)geocoder didFailWithError:(NSError *)error

_reverseGeocoder.delegate = nil;
[_reverseGeocoder autorelease];

У меня была такая же проблема, хотя мой MKReverseGeocoder код следовал одному из примеров Apple (MKReverseGeocoder как глобальный autorelease переменная). Также проблема появилась только на iOS 4.3 (4.0 работал без проблем).

Что решило проблему для меня, так это удаление autorelease часть и выпуская MKReverseGeocoder только в dealoc зрения.

Другие вопросы по тегам