本文重点:
- 限制商户的经验地址定位至大陆以外地区
通过经纬度进行判断。利用高德SDK进行判断。(
如果是手动输入位置信息就进行逆地理编码获取经纬度再进行判断
)
- 优化定位权限的检测逻辑:针对 kCLAuthorizationStatusNotDetermined 情况的处理
用户没有选择是否要使用定位服务(弹框没选择,或者根本没有弹框)[AMapLocationKit] 要在iOS 11及以上版本使用后台定位服务, 需要实现amapLocationManager:doRequireLocationAuth: 代理方法】
I 限制境_外定_位
原理:根据经纬度判断是否在大陆地区
1.1 根据经纬度判断是否在大陆地区
- AMapLocationDataAvailableForCoordinate
/** 根据经纬度判断 是否在大陆地区 */ + (BOOL)inChineseMainlandWithCLLocation:(CLLocation *)location regeocode:(AMapLocationReGeocode *)regeocode{ if(AMapLocationDataAvailableForCoordinate(location.coordinate)){//当前位置在大陆、港澳地区 //香港特别行政区 // 澳门特别行政区 /////省/直辖市 // @property (nonatomic, copy) NSString *province; if([regeocode.province isEqualToString:@"香港特别行政区"] || [regeocode.province isEqualToString:@"澳门特别行政区"]){ return NO; }else{ return YES; } }else{//其他地区 return NO; } return YES; }
用法
CLLocation *location = [[CLLocation alloc]initWithLatitude:[array.lastObject doubleValue] longitude:[array.firstObject doubleValue]]; AMapLocationReGeocode* regeocode = [AMapLocationReGeocode mj_objectWithKeyValues:geocodesDto.mj_keyValues]; if([ERPAMapLocationTool inChineseMainlandWithCLLocation:location regeocode:regeocode]){ }else{ [SVProgressHUD showInfoWithStatus:@"您最新定位不在支持范围内!"]; return; } [weakSelf locotionRequestLat:[NSNumber numberWithDouble:location.coordinate.latitude].description Lon:[NSNumber numberWithDouble:location.coordinate.longitude].description adress:weakSelf.locationView.adressTextView.text];
1.2 通过逆地理编码进行判断定_位是否在大_陆
- 逆地理编码:将经纬度转换为详细结构化的地址,且返回附近周边的POI、AOI信息。
例如:116.480881,39.989410 转换地址描述后:北京市朝阳区阜通东大街6号
- 通过逆地理编码进行判断是否在大陆的处理流程
1、 请求
https://restapi.amap.com/v3/geocode/geo
把用户输入的经营地址位置信息转为经纬度信息 2、根据获取的经纬度信息再进行判断是否在大陆
/** 通过逆地理编码进行判断是否在大陆 */ - (void)setupGeocode{ __weak __typeof__(self) weakSelf = self; if (weakSelf.locationView.adressTextView.text.length > 0) {//1、 判断经营地址信息,不为空进行逆地理编码(请求`https://restapi.amap.com/v3/geocode/geo`把用户输入的经营地址位置信息转为经纬度信息) [SVProgressHUD showWithStatus:@"定位中.."]; AFHTTPSessionManager *managers = [AFHTTPSessionManager manager]; managers.requestSerializer = [AFHTTPRequestSerializer serializer]; managers.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"text/html",@"text/plain",@"application/json",@"text/javascript",nil]; // NSString *urlStr = [NSString stringWithFormat:@"https://restapi.amap.com/v3/geocode/geo"]; NSString *urlStr = k_amap_geocode; NSDictionary *dict = @{@"key" : @"6ccba78b7" , @"address" : weakSelf.locationView.adressTextView.text}; [managers GET:urlStr parameters:dict headers:@{} progress:^(NSProgress * _Nonnull downloadProgress) { NSLog(@"downloadProgress: %@",downloadProgress); [SVProgressHUD dismiss]; } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { NSLog(@"商户进件→商户详情,重新定_位,若输入的地址只有国家+市(例如:中国浙江),点击确定后,去请求第三方地理编码信息(高德API)的时候会转换失败,获取不到经纬度信息。 提示:【获取经纬度失败,请输入详细地址!】 responseObject: %@",responseObject); //status // 返回结果状态值 // 返回值为 0 或 1,0 表示请求失败;1 表示请求成功 CRMgeoDto *dto = [CRMgeoDto mj_objectWithKeyValues:responseObject]; if(dto.status.integerValue == 1){ // 获取经纬度 ,如果失败,提示【获取经纬度失败,请输入准确的经营地址!】 void (^noLocationdataBlock)(void) = ^void(void) { [SVProgressHUD showInfoWithStatus:@"获取经纬度失败,请输入准确的经营地址!"]; }; // responseObject: { // status = 1; // info = OK; // infocode = 10000; // count = 0; // geocodes = ( // ); if(dto.geocodes.count<=0){ noLocationdataBlock(); return ; } CRMgeocodesDto *geocodesDto = dto.geocodes.firstObject; if([NSStringQCTtoll isBlankString:geocodesDto.location]){ noLocationdataBlock(); return ; } NSArray *array = [responseObject[@"geocodes"][0][@"location"] componentsSeparatedByString:@","]; if(array.count<=1){ noLocationdataBlock(); return; } //2、根据获取的经纬度信息再进行判断是否在大陆 CLLocation *location = [[CLLocation alloc]initWithLatitude:[array.lastObject doubleValue] longitude:[array.firstObject doubleValue]]; AMapLocationReGeocode* regeocode = [AMapLocationReGeocode mj_objectWithKeyValues:geocodesDto.mj_keyValues]; if([ERPAMapLocationTool inChineseMainlandWithCLLocation:location regeocode:regeocode]){ }else{ [SVProgressHUD showInfoWithStatus:@"您最新定位不在支持范围内!"]; return; } [weakSelf locotionRequestLat:[NSNumber numberWithDouble:location.coordinate.latitude].description Lon:[NSNumber numberWithDouble:location.coordinate.longitude].description adress:weakSelf.locationView.adressTextView.text]; [weakSelf.locationView.adressTextView resignFirstResponder]; weakSelf.locationView.frame = CGRectMake(0, kHeight, kWidth, KWratio(self.locationViewH)); weakSelf.bacV.hidden = YES; }else{ [SVProgressHUD showInfoWithStatus:@"请输入准确的经营地址!"]; } } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { [SVProgressHUD showInfoWithStatus:@"网络错误!"]; }]; } else {// 经营地址为空 [SVProgressHUD showInfoWithStatus:@"请输入经营地址"]; } }
II 测试验证
测试方法:修改位_置信息
方法1:借助i4Tools修改真机地址
- 借助i4Tools
安装命令行工具代码:xcode-select --install 自签命令代码:codesign -f -s - --deep /Applications/i4Tools.app
方法2:使用模拟器修改地址
- 测试数据
// province=香港特别行政区 latitude=22.26429541107516 longitude=114.18135238995905 // province=澳门特别行政区 latitude=22.135584619138957 longitude=113.57214697205735 2020-04-09 15:39:54.504424+0800 retail[8369:4238323] reGeocode:AMapLocationReGeocode:{formattedAddress:澳门特别行政区圣方济各堂区靠近澳门青年挑战营; country:中国;province:澳门特别行政区; city:(null); district:圣方济各堂区; citycode:1853; adcode:820008; street:(null); number:(null); POIName:澳门青年挑战营; AOIName:(null);} 121.524582,25.028822 2020-04-09 16:02:47.411507+0800 retail[8369:4238323] reGeocode:AMapLocationReGeocode:{formattedAddress:台湾省(私)私立七田真超右脑教育托儿所; country:中国;province:台湾省; city:(null); district:(null); citycode:1886; adcode:710000; street:(null); number:(null); POIName:(私)私立七田真超右脑教育托儿所; AOIName:(null);}
【获取更多经纬度数据:https://lbs.amap.com/console/show/picker】
方法3:通过GPX文件修改经纬度信息
iOS测试技巧:通过GPX文件修改经纬度信息(模拟iOS设备的位置)
III 定_位权限的检测逻辑
优化定_位权限的检测逻辑:
主要针对iOS13访问位置信息信息新增的【下次询问】的场景):iOS 13新增App地理位置访问“仅允许一次”
测试方法:先设置【使用app时允许】,再去系统的设置修改定位信息的权限为:【下次询问】。回到app去更新定位信息。
定位之前检测权限发现是kCLAuthorizationStatusNotDetermined的时,需要实现amapLocationManager:(AMapLocationManager *)manager doRequireLocationAuth:(CLLocationManager*)locationManager
方法,来让用户进行选择
- (void)amapLocationManager:(AMapLocationManager *)manager doRequireLocationAuth:(CLLocationManager*)locationManager { [locationManager requestAlwaysAuthorization]; }
IV、风险商户处理
- 盗刷拒付风险
- 疑似欺诈、电诈、套现风险
- 赌博、异常大额、异常测试:
- 跨境风险