4

CLGeocoderに非常に失望した後、代わりにGoogleMapsAPIを使用することにしました。

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];

私はこのフィードバックを受け取ります:

結果を取得:'(null)'(null)エラーなし{"Cache-Control" = "public、max-age = 86400"; "Content-Encoding" = gzip; "Content-Length" = 1603; "Content-Type" = "application / json; charset = UTF-8"; 日付="2012年12月7日金曜日08:51:58GMT"; Expires="2012年12月8日土曜日08:51:58GMT"; サーバー=mafe; Vary ="Accept-Language"; "X-Frame-Options" = SAMEORIGIN; "X-XSS-Protection" = "1; mode = block"; } http://maps.googleapis.com/maps/api/geocode/json?sensor=true&address=thorsgade

結果はヌルですが、エラーはありません。コンテンツはヘッダーでJSONとして認識されますが、生のJSONはnullです。

厄介なのは、ブラウザでhttp://maps.googleapis.com/maps/api/geocode/json?sensor=true&address=thorsgadeを開くと、たくさんの結果が得られることです。

これまで私は試しました:

  • センサーブールオンの真/偽をフリックします。
  • ユーザーエージェントを通常のサファリに偽造する。
  • GETの代わりにPOSTを使用してください。

運がない...

4

1 に答える 1

1

問題が解決しない場合は、代わりにMKNetworkKitを使用することをお勧めします

これが私の解決策です-

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

GoogleGeocodeApi.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;
}

コードのどこか

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]);
               }];
于 2012-12-09T02:01:24.660 に答える