2

私はこのチュートリアルに従っています: http://www.raywenderlich.com/13160/using-the-google-places-api-with-mapkitですが、何らかの理由で私のアプリが戻ってきます:

Google データ: ( )

ここに私の.hファイルがあります:

#import <UIKit/UIKit.h>
#import <MapKit/MapKit.h>
#import <CoreLocation/CoreLocation.h>

#define kBgQueue dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)

#define kGOOGLE_API_KEY @"API PLACED HERE, LEFT BLANK FOR STACKOVERFLOW"

@interface ViewController : UIViewController <MKMapViewDelegate,     CLLocationManagerDelegate>
{
CLLocationManager *locationManager;
CLLocationCoordinate2D currentCentre;
int currenDist;
}

@property (strong, nonatomic) IBOutlet MKMapView *mapView;
@end

そして私の実装ファイル:

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad
{
[super viewDidLoad];

// Do any additional setup after loading the view, typically from a nib.

//Make this controller the delegate for the map view.
self.mapView.delegate = self;

// Ensure that you can view your own location in the map view.
[self.mapView setShowsUserLocation:YES];

//Instantiate a location object.
locationManager = [[CLLocationManager alloc] init];

//Make this controller the delegate for the location manager.
[locationManager setDelegate:self];

//Set some parameters for the location object.
[locationManager setDistanceFilter:kCLDistanceFilterNone];
[locationManager setDesiredAccuracy:kCLLocationAccuracyBest];
}

- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (IBAction)toolBarButtonPress:(UIBarButtonItem *)sender {
UIBarButtonItem *button = (UIBarButtonItem *)sender;
NSString *buttonTitle = [button.title lowercaseString];
[self queryGooglePlaces:buttonTitle];

}

-(void) queryGooglePlaces: (NSString *) googleType {
NSString *url = [NSString     stringWithFormat:@"https://maps.googleapis.com/maps/api/place/search/json?  location=%f,%f&radius=%@&types=%@&sensor=true&key=%@", currentCentre.latitude, currentCentre.longitude, [NSString stringWithFormat:@"%i", currenDist], googleType,     kGOOGLE_API_KEY];
url = [url stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

NSLog(@"%@", url);

//Formulate the string as a URL object.
NSURL *googleRequestURL=[NSURL URLWithString:url];

// Retrieve the results of the URL.
dispatch_async(kBgQueue, ^{
    NSData* data = [NSData dataWithContentsOfURL: googleRequestURL];
    [self performSelectorOnMainThread:@selector(fetchedData:) withObject:data  waitUntilDone:YES];
});
}

-(void)fetchedData:(NSData *)responseData {
//parse out the json data
NSError* error;
NSDictionary* json = [NSJSONSerialization
                      JSONObjectWithData:responseData

                      options:kNilOptions
                      error:&error];

//The results from Google will be an array obtained from the NSDictionary object with the  key "results".
NSArray* places = [json objectForKey:@"results"];

//Write out the data to the console.
NSLog(@"Google Data: %@", places);
}

-(void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated {
//Get the east and west points on the map so you can calculate the distance (zoom level)  of the current map view.
MKMapRect mRect = self.mapView.visibleMapRect;
MKMapPoint eastMapPoint = MKMapPointMake(MKMapRectGetMinX(mRect),  MKMapRectGetMidY(mRect));
MKMapPoint westMapPoint = MKMapPointMake(MKMapRectGetMaxX(mRect), MKMapRectGetMidY(mRect));

//Set your current distance instance variable.
currenDist = MKMetersBetweenMapPoints(eastMapPoint, westMapPoint);

//Set your current center point on the map instance variable.
currentCentre = self.mapView.centerCoordinate;
}

#pragma mark - MKMapViewDelegate methods.
- (void)mapView:(MKMapView *)mv didAddAnnotationViews:(NSArray *)views {
MKCoordinateRegion region;
region =  MKCoordinateRegionMakeWithDistance(locationManager.location.coordinate,1000,1000);


[mv setRegion:region animated:YES];
}

@end

最終的にフォーマットされた URL のコンソール ログは次のとおりです。

https://maps.googleapis.com/maps/api/place/search/json? location=HIDDENLAT,HIDDENLONG&radius=995&types=bar&sensor=true&key=HIDDENAPI

上記で生成された緯度、経度、API の値を置き換えましたが、正しい値として返されましたか?

私が見つけた別のSOの答えは、次を追加すると言った:

url = [url stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

私はこれをしましたが、これはうまくいきませんでした??

これが機能しない理由はありますか!? 私は髪を引っ張って、それを取り除こうとしています!

ありがとうございました!

4

2 に答える 2

2

将来の回答者にとって、これは、API キー、検索範囲、検索の「タイプ」、または JSON 解析の問題を含む多くの問題である可能性があります。ただし、コードは、Gary Stewart が上に投稿したとおりに実行する必要があります。彼は、質問をするだけで答えを見つけるのを手伝ってくれました...

NSLog(@"%@", url);上記と同様に、queryGooglePlaces メソッドの URL 文字列の後に追加します。これにより、URL 要求がコンソールに記録されるため、期待どおりにコンパイルされていることを確認できます。それでもデータが返されない場合は、コンソールから生成した URL をコピーして、Web ブラウザーで開きます。生成されたページの下部に、データを取得できない理由が表示されます。

Google の開発者向けドキュメントから:

検索応答オブジェクト内の「ステータス」フィールドには、リクエストのステータスが含まれており、リクエストが失敗した理由を追跡するのに役立つデバッグ情報が含まれている場合があります。「ステータス」フィールドには、次の値が含まれる場合があります。

OKは、エラーが発生しなかったことを示します。場所が正常に検出され、少なくとも 1 つの結果が返されました。ZERO_RESULTSは、検索は成功したが結果が返されなかったことを示します。これは、検索に遠隔地の緯度経度が渡された場合に発生する可能性があります。 OVER_QUERY_LIMITは、割り当てを超えていることを示します。 REQUEST_DENIEDは、通常はセンサー パラメーターがないために、リクエストが拒否されたことを示します。INVALID_REQUESTは通常、必要なクエリ パラメータ (場所または半径) が欠落していることを示します。

私の問題は、単に「食べ物」ではなく「朝食」の「タイプ」の検索を送信していたことです。愚かな私、「朝食」はキーワードであり、タイプではありません.

(ちなみに、サポートされているタイプのリストは次のとおりです: https://developers.google.com/places/documentation/supported_types )

これが問題の発見に役立つことを願っています。頑張ってください!

于 2014-01-13T04:11:28.720 に答える
1

変化する

@"https://maps.googleapis.com/maps/api/place/search/json?  location=%f,%f&radius=%@&types=%@&sensor=true&key=%@"

@"https://maps.googleapis.com/maps/api/place/search/json?location=%f,%f&radius=%@&types=%@&sensor=true&key=%@"

(つまり、url テンプレート文字列の ? の後にスペースはありません)

于 2013-10-22T23:55:18.783 に答える