Как бороться с ошибками 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
зрения.