我正在使用这个教程:http://www.raywenderlich.com/13160/using-the-google-places-api-with-mapkit,但由于某种原因,我的应用程序正在返回:
谷歌数据:()
下面是我的.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];
我做了但这对我没用
为什么不管用?
2条答案
按热度按时间mspsb9vt1#
这可能是一系列问题,包括您的API密钥,您的搜索半径,或您的搜索“类型”,或JSON解析问题。然而,代码应该完全按照加里Stewart在上面发布的那样进行。他甚至通过提出问题帮助我找到了答案...
在queryGooglePlaces方法中的URL字符串后添加
NSLog(@"%@", url);
。这会将URL请求记录到您的控制台,以便您可以确保它按预期编译。如果它是,但您仍然没有得到数据回来,然后复制您从控制台生成的URL,并在Web浏览器中打开它。在生成的页面底部,它会告诉您为什么您没有得到数据。Google开发者文档:
搜索响应对象中的“status”字段包含请求的状态,并且可能包含调试信息以帮助您跟踪请求失败的原因。“status”字段可能包含以下值:
OK表示没有错误;成功检测到位置,并至少返回了一个结果。ZERO_RESULTS表示搜索成功,但未返回任何结果。如果搜索在远程位置传递了latlng,则可能会发生这种情况。OVER_QUERY_LIMIT表示您已超出配额。REQUEST_DENIED表示您的请求被拒绝。INVALID_REQUEST通常表示缺少所需的查询参数(位置或半径)。
我的问题是,我发送的搜索“类型”的“早餐”,而不是简单的“食物”。愚蠢的我,“早餐”将是一个关键字,而不是一个类型。
(Here的支持类型列表:https://developers.google.com/places/documentation/supported_types)
1yjd4xko2#
变更
到
(ie,url模板字符串中的?后无空格)