Как бороться с ошибками MKReverseGeocoder / PBHTTPStatusCode = 503 в iOS 4.3? - PullRequest
6 голосов
/ 08 марта 2011

Начиная с 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 ]

5 голосов
/ 14 марта 2011

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

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

4 голосов
/ 21 июля 2011

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

Itу меня работает на 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"];
    }
}
2 голосов
/ 11 марта 2011

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

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

1 голос
/ 09 августа 2011

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

1 голос
/ 28 апреля 2011

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

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

1 голос
/ 07 апреля 2011

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

_reverseGeocoder.delegate = nil;
[_reverseGeocoder autorelease];
...