2010-10-13 15 views
10

Continuo a ricevere questo a caso quando eseguo la mia app gps che sto costruendo. Non succede tutte le volte e le coordinate passate sono sempre valide (li ho registrati). C'è documentazione per questi da qualche parte?Errore MKErrorDomain 4 iPhone

EDIT:

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

e quindi circa la metà del tempo che restituisce un errore. Ho provato a rilasciare e riassegnare il geocoder se si è verificato un errore, ma questo non ha aiutato. L'unica cosa che ha fatto è stata riavviare l'app.

+0

Ho appena iniziato a ricevere lo stesso errore di recente. È anche irregolare per me - a volte il geocoder funziona bene, a volte restituisce solo un errore, passando ogni volta le stesse coordinate o molto simili. Forse Google Geocoder sta avendo dei problemi? –

+0

Avendo lo stesso problema. A volte funziona in Maps.app ma non nella mia app. Quindi funziona di nuovo. Forse un problema di caricamento sui server di Google? –

risposta

3

Ho riscontrato ripetutamente questo errore e non sono riuscito a capire come fermarlo; ma alla fine ho trovato un end-run sull'intero problema che funziona abbastanza bene, e richiede solo un po 'di lavoro: non usare affatto lo MKReverseGeocoder di Apple - chiama direttamente lo Google's reverse-geocoding API (questo è apparentemente lo stesso servizio che lo MKReverseGeocoder fa dietro le quinte). Puoi recuperare JSON o XML (le tue preferenze), che dovrai analizzare, ma non è troppo difficile.

Per esempio, dal momento che la mia applicazione sta usando ASIHTTPRequest, questo è ciò che sembra (anche se questo sarebbe anche facile da fare con che fare con le API di Apple native come 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]; 
} 

A proposito , L'API di Google ha regole, proprio come fa Apple. Assicurati di leggere i documenti, in particolare per quanto riguarda le quote.

11

In "MKTypes.h" nel quadro MapKit, è definito il seguente:

costanti di errore per il framework Map Kit.

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

...

MKErrorPlacemarkNotFound

Il segnaposto specificato non è stato trovato.

Sembra che tu stia facendo riferimento a un segnaposto sconosciuto nel tuo codice? Oppure potrebbe essere che Google non abbia un nome per la posizione che stai passando - per quanto valide possano essere le coordinate.

+0

Sì, ho trovato quelle costanti, ma il problema è come risolverlo, e più curiosamente, perché sembra accadere casualmente. È forse possibile ottenere diversi livelli di precisione in tempi diversi e con più o meno posizioni decimali? – Marty

+0

Se hai pubblicato del codice che mostra dove ricevi questi errori, sarà molto più semplice aiutarti. –

+0

Vedi modifica sopra. – Marty

0

In realtà, sto riscontrando anche questo problema. Il codice è estremamente compatto

// 1. chiedere la mappa per le attuali coordie

CLLocationCoordinate2D userLocation;

userLocation.latitude = [[_theMapView.userLocation location] coordinate] .latitude; userLocation.longitude = [[_theMapView.userLocation location] coordinate] .longitude;

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

// 2. reverse geocode coords

MKReverseGeocoder * reverseGeocoder = [[MKReverseGeocoder alloc] initWithCoordinate: userLocation];

[reverseGeocoder setDelegate: self];

[startGeocoder start];

e successivamente semplicemente NSLog l'errore nel metodo di delega fail. Funziona la prima volta o due, quindi smette di funzionare

1

Ho appena finito con un sacco di ricerche su questo problema e sembra essere al di fuori delle nostre mani. Ho controllato i forum degli sviluppatori, oltre a tutto lo Stack e altrove e nessuno ha una soluzione diversa dall'utilizzo di un servizio diverso. C'è una bella discussione su https://devforums.apple.com/message/154126 sull'argomento.

Alcune persone trovano l'errore dopo un certo tempo, lo trovo solo fuori per un po 'e poi torna indietro. Ho guardato il codice di esempio "Current Address" e non ho visto come avrei potuto incasinare.Ho eseguito il codice di esempio e abbastanza sicuro, si trattava di errori NSLogging invece di restituire una posizione.

Questo collegamento ha qualche codice utilizzando geocoding inverso di Google: http://www.iphonedevsdk.com/forum/iphone-sdk-development/31883-pbrequestererrordomain-errors-reverse-geocoding.html#post155793

2

sto correndo nella stessa cosa (lo stesso codice esatto non a caso a volte) e penso di aver trovato la risposta. Da Apple's developer docs: "Ogni applicazione Map Kit ha una quantità limitata di capacità di geocodifica inversa, quindi è vantaggioso utilizzare le richieste di geocodifica inversa con parsimonia."

Quindi la mia teoria è che stiamo ottenendo un limite di frequenza ... poiché non cambiano altre variabili (cioè il mio codice non sta cambiando, lo sto eseguendo sul simulatore quindi la posizione del dispositivo non è t cambiando, ecc.) Penso che questa sia l'unica ragione rimasta.

4

Ho incontrato e risolto questo problema di recente. Nel mio caso, quando Apple Map non riesce a trovare alcun risultato per una query, a volte questo errore "MKErrorDomain = 4" viene generato. Così ho finito per considerare questo come "risultato non trovato".

È stato meticoloso scoprirlo, MapKit ha bisogno di un sistema di gestione degli errori migliore.

Problemi correlati