最近公司要求添加定位功能,我们的需求是在全球都可以定位,经过了解腾讯地图API,发现定位不是太准,但是还是可以用到的。
下面跟大家分享一下腾讯地图单次定位:
要用以上路径进行导入,我之前直接拖入的话会报错。但是只有我这样,我身边的狼友没有遇到。
集成报错的坑呢就遇到这一个。我在项目中主要用到的的逆向解析和单次定位。
单次定位代码:
/*****初始化*****/
- (void)configLocationManager
{
self.locationManager = [[TencentLBSLocationManager alloc] init];
[self.locationManager setDelegate:self];
[self.locationManager setApiKey:@"自己申请的腾讯地图Key"];
[self.locationManager setPausesLocationUpdatesAutomatically:NO];
// 需要后台定位的话,可以设置此属性为YES。
[self.locationManager setAllowsBackgroundLocationUpdates:NO];
// 如果需要POI信息的话,根据所需要的级别来设定,定位结果将会根据设定的POI级别来返回,如:
[self.locationManager setRequestLevel:TencentLBSRequestLevelName];
// 申请的定位权限,得和在info.list申请的权限对应才有效
CLAuthorizationStatus authorizationStatus = [CLLocationManager authorizationStatus];
if (authorizationStatus == kCLAuthorizationStatusNotDetermined) {
[self.locationManager requestWhenInUseAuthorization];
}
}
// 单次定位
- (void)startSingleLocation {
[self.locationManager requestLocationWithCompletionBlock:
^(TencentLBSLocation *location, NSError *error) {
// _theNameLab.text = [NSString stringWithFormat:@"国家:%@,省份:%@,城市:%@,地点:%@,街道:%@,名称:%@,区县:%@",location.nation,location.province,location.city,location.address,location.street,location.name,location.district];
_theAddressArr = [[NSArray alloc]init];
_theAddressArr =location.poiList;
_AddressStr =[NSString stringWithFormat:@"%@%@ ",location.city,location.name];
if ([_AddressStr isEqualToString:@"<null> "]||_AddressStr == nil||[_AddressStr isEqualToString:@"(null) "]) {
_AddressStr = @"";
_DiZhiBut.hidden = YES;
theStr = @"";
}else{
_DiZhiBut.hidden = NO;
[_DiZhiBut setTitle:_AddressStr forState:UIControlStateNormal];
theStr = [NSString stringWithFormat:@"%f,%f",location.poiList[0].latitude,location.poiList[0].longitude];
}
theNameArr = [[NSMutableArray alloc]init];
theAddressArr = [[NSMutableArray alloc]init];
for (int yu =0; yu < _theAddressArr.count; yu++) {
NSString *theNameStr = [NSString stringWithFormat:@"%@ ",location.poiList[yu].name];
if ([theNameStr isEqualToString:@"<null> "]||theNameStr == nil||[theNameStr isEqualToString:@"(null) "]) {
theNameStr = @"";
}
[theNameArr addObject:theNameStr];
NSString *theOneAddressStr =[NSString stringWithFormat:@"%@ ",location.poiList[yu].address];
if ([theOneAddressStr isEqualToString:@"<null> "]||theOneAddressStr == nil||[theOneAddressStr isEqualToString:@"(null) "]) {
theOneAddressStr = @"";
}
[theAddressArr addObject:theOneAddressStr];
}
}];
}
里面的代码可以忽略,根据自己的需求写。
//定位代理方法——————判断是否开启定位。我们需要在plist文件中添加字段。
- (void)tencentLBSLocationManager:(TencentLBSLocationManager *)manager
didFailWithError:(NSError *)error {
CLAuthorizationStatus authorizationStatus = [CLLocationManager authorizationStatus];
if (authorizationStatus == kCLAuthorizationStatusDenied ||
authorizationStatus == kCLAuthorizationStatusRestricted) {
// [self.theNameLab setText:@"定位权限没开启!"];
self.themessSwitch.on = NO;
UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"提示"
message:@"定位权限未开启,是否开启?"
preferredStyle:UIAlertControllerStyleAlert];
[alert addAction:[UIAlertAction actionWithTitle:@"是"
style:UIAlertActionStyleDefault
handler:^(UIAlertAction * _Nonnull action) {
if( [[UIApplication sharedApplication]canOpenURL:
[NSURL URLWithString:UIApplicationOpenSettingsURLString]] ) {
[[UIApplication sharedApplication] openURL:
[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
}
}]];
[alert addAction:[UIAlertAction actionWithTitle:@"否"
style:UIAlertActionStyleDefault
handler:^(UIAlertAction * _Nonnull action) {
}]];
[self presentViewController:alert animated:true completion:nil];
} else {
self.themessSwitch.on = YES;
// [self.theNameLab setText:[NSString stringWithFormat:@"%@", error]];
}
}
以上就是单次定位。
逆向解析:
逆向解析首先需要俩个值,1.经度2.纬度,通过这俩个值用get请求接口:
http://apis.map.qq.com/ws/geocoder/v1/?location=%@&get_poi=1&key=ke y&poi_options=address_format=short;radius=2000;page_size=20;page_index=1;policy=1
//里面的参数自己添加更改,根据腾讯地图文档。
1.通过值获取地址
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
NSString *theStrOne = [NSString stringWithFormat:@"http://apis.map.qq.com/ws/geocoder/v1/?location=%@&get_poi=1&key=key&poi_options=address_format=short;radius=2000;page_size=20;page_index=1;policy=1",_theStr];
[manager GET:theStrOne parameters:nil progress:nil success:
^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
_theAddressArr = [[NSArray alloc]init];
NSString *theStr = [NSString stringWithFormat:@"%@",[responseObject objectForKey:@"message"]];
if ([theStr isEqualToString:@"query ok"]) {
_theAddressArr =[[responseObject objectForKey:@"result"]objectForKey:@"pois"];
[_theAddressTable reloadData];
}
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
}];
请求到的就是附近位置。
//PS:如有侵权,请联系删除,谢谢。