You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Geolocation API生成随机位置:频繁出现ZERO_RESULTS问题求助

解决谷歌地理编码API频繁返回“ZERO_RESULTS”的问题

问题根源分析

  1. API参数错误:原请求中的&sensor=false,+CA属于无效配置——sensor参数已被谷歌API废弃,额外的+CA会强制添加加拿大地理限定,导致其他国家代码的解析逻辑被干扰。
  2. 地址格式不明确:直接传递国家代码(如"AF")时,API无法精准识别这是国家维度的查询,容易误判为其他地址类型,导致解析失败。
  3. 无效/无意义的代码:你的国家代码数组中存在格式错误项(如,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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 02:50:39