Geolocation API生成随机位置:频繁出现ZERO_RESULTS问题求助
解决谷歌地理编码API频繁返回“ZERO_RESULTS”的问题
问题根源分析
- API参数错误:原请求中的
&sensor=false,+CA属于无效配置——sensor参数已被谷歌API废弃,额外的+CA会强制添加加拿大地理限定,导致其他国家代码的解析逻辑被干扰。 - 地址格式不明确:直接传递国家代码(如"AF")时,API无法精准识别这是国家维度的查询,容易误判为其他地址类型,导致解析失败。
- 无效/无意义的代码:你的国家代码数组中存在格式错误项(如
,CV多了前置逗号、CW包含不可见控制字符),还有部分无有效地理坐标的地区(如"AQ"南极洲),这类请求必然返回ZERO_RESULTS。
解决方案
1. 修正API请求格式
使用components=country:XX的语法明确指定查询维度,同时移除废弃参数和多余限定。修改后的代码如下:
int randomIndex = arc4random() % [arr_OfCountryCode count]; NSString *countryCode = [arr_OfCountryCode objectAtIndex:randomIndex]; // 注意给URL做编码处理,避免特殊字符导致请求失败 NSString *encodedCode = [countryCode stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]]; NSString *urlString = [NSString stringWithFormat:@"https://maps.googleapis.com/maps/api/geocode/json?components=country:%@&key=MY_GOOGLE_KEY", encodedCode];
2. 清理并优化国家代码数组
- 移除格式错误项:将
,CV改为CV,删除CW中的不可见字符改为CW; - 过滤无有效坐标的地区:比如"AQ"(南极洲)、"BV"(布韦岛)等无人区或无明确地理标识的代码;
优化后的数组示例(仅展示修正部分,其余正确代码保留):
arr_OfCountryCode = @[@"AF",@"AL",@"DZ",@"AS",@"AD",@"AO",@"AI",@"AG",@"AR",@"AM",@"AW",@"AC",@"AU",@"AT",@"AZ",@"BS",@"BH",@"BD",@"BB",@"BY",@"BE",@"BZ",@"BJ",@"BM",@"BT",@"BO",@"BA",@"BW",@"BR",@"IO",@"VG",@"BN",@"BG",@"BF",@"BI",@"KH",@"CM",@"CA",@"IC",@"CV",@"BQ",@"KY",@"CF",@"EA",@"TD",@"CL",@"CN",@"CX",@"CP",@"CC",@"CO",@"KM",@"CD",@"CG",@"CK",@"CR",@"HR",@"CU",@"CW",@"CY",@"CZ",@"CI",@"DK",@"DG",@"DJ",@"DM",@"DO",@"EC",@"EG",@"SV",@"GQ",@"ER",@"EE",@"ET",@"FK",@"FO",@"FJ",@"FI",@"FR",@"FG",@"PF",@"TF",@"GA",@"GM",@"GE",@"DE",@"GH",@"GI",@"GR",@"GL",@"GD",@"GP",@"GU",@"GT",@"GG",@"GN",@"GW",@"GY",@"HT",@"HM",@"HN",@"HK",@"HU",@"IS",@"IN",@"ID",@"IR",@"IQ",@"IE",@"IM",@"IL",@"IT",@"JM",@"JP",@"JE",@"JO",@"KZ",@"KE",@"KI",@"XK",@"KW",@"KG",@"LA",@"LV",@"LB",@"LS",@"LR",@"LY",@"LI",@"LT",@"LU",@"MO",@"MK",@"MG",@"MW",@"MY",@"MV",@"ML",@"MT",@"MH",@"MQ",@"MR",@"MU",@"YT",@"MX",@"FM",@"MD",@"MC",@"MN",@"ME",@"MS",@"MA",@"MZ",@"MM",@"NA",@"NR",@"NP",@"NL",@"NC",@"NZ",@"NI",@"NE",@"NG",@"NU",@"NF",@"KP",@"MP",@"NO",@"OM",@"PK",@"PW",@"PS",@"PA",@"PG",@"PY",@"PE",@"PH",@"PN",@"PL",@"PT",@"PR",@"QA",@"RO",@"RU",@"RW",@"RE",@"WS",@"SM",@"SA",@"SN",@"RS",@"SC",@"SL",@"SG",@"SX",@"SK",@"SI",@"SB",@"SO",@"ZA",@"GS",@"KR",@"SS",@"ES",@"LK",@"BL",@"SH",@"KN",@"LC",@"MF",@"PM",@"VC",@"SD",@"SR",@"SJ",@"SZ",@"SE",@"CH",@"SY",@"ST",@"TW",@"TJ",@"TZ",@"TH",@"TL",@"TG",@"TK",@"TO",@"TT",@"TA",@"TN",@"TR",@"TM",@"TC",@"TV",@"UM",@"VI",@"UG",@"UA",@"AE",@"GB",@"US",@"UY",@"UZ",@"VU",@"VA",@"VE",@"VN",@"WF",@"EH",@"YE",@"ZM",@"ZW",@"AX"];
3. 添加失败重试机制
即使做了上述优化,仍可能存在个别代码解析失败的情况,建议添加重试逻辑,直到获取有效结果或达到重试上限:
- (void)fetchRandomCountryCoordinate { int maxRetries = 3; int retryCount = 0; BOOL success = NO; while (!success && retryCount < maxRetries) { int randomIndex = arc4random() % [arr_OfCountryCode count]; NSString *countryCode = [arr_OfCountryCode objectAtIndex:randomIndex]; NSString *encodedCode = [countryCode stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]]; NSString *urlString = [NSString stringWithFormat:@"https://maps.googleapis.com/maps/api/geocode/json?components=country:%@&key=MY_GOOGLE_KEY", encodedCode]; NSURL *url = [NSURL URLWithString:urlString]; NSURLRequest *request = [NSURLRequest requestWithURL:url]; // 异步请求示例(推荐使用NSURLSession代替NSURLConnection) NSURLSessionDataTask *task = [[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { if (data && !error) { NSDictionary *responseDict = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil]; NSString *status = responseDict[@"status"]; if ([status isEqualToString:@"OK"]) { success = YES; NSDictionary *location = responseDict[@"results"][0][@"geometry"][@"location"]; double lat = [location[@"lat"] doubleValue]; double lng = [location[@"lng"] doubleValue]; // 主线程更新UI或处理坐标 dispatch_async(dispatch_get_main_queue(), ^{ NSLog(@"随机坐标:%f, %f", lat, lng); }); } else { // 未成功则重试 retryCount++; if (retryCount < maxRetries) { [self fetchRandomCountryCoordinate]; } else { dispatch_async(dispatch_get_main_queue(), ^{ NSLog(@"多次重试后仍无法获取有效坐标"); }); } } } }]; [task resume]; break; } }
内容的提问来源于stack exchange,提问作者DannyRoy
相关产品推荐
相关产品推荐

