2012-12-07 6 views
4

Après avoir été très déçu par CLGeocoder, j'ai décidé d'utiliser l'API GoogleMaps à la place.AFNetwork et GoogleAPI retournant NULL

J'ai conçu l'appel comme suit, en utilisant AFNetwork:

AFHTTPClient *new = [[AFHTTPClient alloc] initWithBaseURL:[NSURL URLWithString:@"http://maps.googleapis.com/"]]; 

    NSDictionary *dict = [[NSDictionary alloc] initWithObjects:[NSArray arrayWithObjects:@"thorsgade",@"true", nil] forKeys:[NSArray arrayWithObjects:@"address",@"sensor", nil]]; 
    NSMutableURLRequest *req = [new requestWithMethod:@"GET" path:@"maps/api/geocode/json" parameters:dict]; 

AFJSONRequestOperation *call = [AFJSONRequestOperation JSONRequestOperationWithRequest:req success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) { 
      NSArray *geos = [JSON objectForKey:@"results"]; 
    DLog(@"Got result : '%@' %@ from %@ %@ %@",JSON,geos,[NSHTTPURLResponse localizedStringForStatusCode:response.statusCode],response.allHeaderFields,request.URL.description); 

     } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) { 
      DLog(@"Failed %@ %@",error.localizedDescription,request.URL.description); 
     }]; 

[call start]; 

Je reçois ces commentaires:

résultat obtenu: (null) (null) d'aucune erreur { " Cache-Control "=" public, max-age = 86400 "; "Content-Encoding" = gzip; "Content-Length" = 1603; "Content-Type" = "application/json; jeu de caractères = UTF-8"; Date = "Ven, 07 Dec 2012 08:51:58 GMT"; Expires = "Sat, 08 Dec 2012 08:51:58 GMT"; Serveur = mafe; Vary = "Accept-Language"; "X-Frame-Options" = SAMEORIGIN; "X-XSS-Protection" = "1; mode = bloc"; } http://maps.googleapis.com/maps/api/geocode/json?sensor=true&address=thorsgade

Résultat nul, mais aucune erreur. Le contenu est reconnu dans les en-têtes en tant que JSON, mais le JSON brut est null. Le problème est que si j'ouvre http://maps.googleapis.com/maps/api/geocode/json?sensor=true&address=thorsgade dans un navigateur, j'obtiens beaucoup de résultats.

Jusqu'à présent, j'ai essayé:

  • Effleurer le capteur booleon vrai/faux. Faking l'utilisateur-agent pour être un safari régulier
  • Utilisez POST au lieu de GET.

Sans chance ...

+0

il fonctionne bien pour moi :), la version iOS sur le contrôle vous? – aahsanali

+0

im vérification dans 6.0 et 6.0.1 –

Répondre

1

Si le problème persiste, je vous conseille d'utiliser à la place MKNetworkKit

Voici ma solution -

GoogleGeocodeApi.h

//GoogleGeocodeApi.h 
#import <Foundation/Foundation.h> 
#import "MKNetworkEngine.h" 

typedef void (^JsonResponseBlock)(NSDictionary *); 
typedef void (^ErrorBlock)(NSError* error); 

@interface GoogleGeocodeApi : MKNetworkEngine 

-(MKNetworkOperation*) geocodeWithAddress: (NSString *) address 
          onCompletion:(JsonResponseBlock) completionBlock 
            onError:(ErrorBlock) errorBlock; 

@end 

GoogleGeocode Api.m

//GoogleGeocodeApi.m 
#import "GoogleGeocodeApi.h" 

@implementation GoogleGeocodeApi 

-(id)init 
{ 
    if (self = [super initWithHostName:@"maps.googleapis.com" apiPath:@"maps/api/geocode" customHeaderFields:nil]) { 

    } 
    return self; 
} 

-(MKNetworkOperation*) geocodeWithAddress: (NSString *) address 
          onCompletion:(JsonResponseBlock) completionBlock 
            onError:(ErrorBlock) errorBlock; 
{ 
    MKNetworkOperation *op = [self operationWithPath:[NSString stringWithFormat:@"json?sensor=true&address=%@", address] params:nil httpMethod:@"GET"]; 
    [op onCompletion:^(MKNetworkOperation *completedOperation) { 
     NSDictionary *responseJSON = [completedOperation responseJSON]; 
     if (responseJSON && [[responseJSON objectForKey:@"status"] isEqualToString:@"OK"]) { 
      completionBlock(responseJSON); 
     } else { 
      NSDictionary* errorDictionary = @{NSLocalizedDescriptionKey :@"Google geocode failed!"}; 
      NSError *error = [NSError errorWithDomain:@"Failed response" code:100 userInfo:errorDictionary]; 
      errorBlock(error); 
     } 
    } onError:^(NSError* error) { 
     errorBlock(error); 
    }]; 

    [self enqueueOperation:op]; 

    return op; 
} 

Quelque part dans le code

GoogleGeocodeApi *gma = [[GoogleGeocodeApi alloc] init]; 

    [gma geocodeWithAddress:@"thorsgade" 
       onCompletion:^(NSDictionary *responseJSON) { 
        NSLog(@"Geocode succeeded: %@", responseJSON); 
       } onError:^(NSError *error) { 
        NSLog(@"Geocode failed with error: %@", [error localizedDescription]); 
       }]; 
Questions connexes