iOS应用调用Google Places API遭拒,请求被拒绝问题排查
解决Google Places Details API请求被拒(REQUEST_DENIED)的问题
问题场景
iOS应用调用Google Places Details API时返回4xx错误,错误内容:
"error_message": "This IP, site or mobile application is not authorized to use this API key. Request received from IP address [IP address], with empty referer"
"status": "REQUEST_DENIED"
同一API密钥在应用中加载Google Maps完全正常,但Places请求始终失败,已经试过新建密钥、硬编码参数、调整密钥限制、启用Places服务等操作,依赖版本为8.3.0。
解决步骤
1. 核对API密钥的iOS应用限制配置
地图能正常使用不代表Places API的限制校验逻辑一致:
- 打开Google Cloud控制台的API密钥管理页,找到目标密钥
- 把应用限制设为
iOS应用 - 准确添加你的应用Bundle ID,注意大小写(比如
com.xxx.yourapp) - 保存后等5-10分钟让配置同步(Google的配置生效有延迟)
2. 确认启用的是新版Places API
旧版Places API已逐步停用,可能导致权限校验失败:
- 在Cloud控制台API库搜索
Places API,确保启用的是带"New"标识的新版Places API
3. 修正请求参数的拼写错误
你的代码里用的是placeid,但Google官方要求的参数名是place_id(带下划线),参数错误会导致API无法正确识别请求,甚至返回误导性的授权错误:
func fetchPlaceDetails(placeId: String) { let apiKey = "My Google API KEY" // 修正参数名为place_id let urlString = "https://maps.googleapis.com/maps/api/place/details/json?place_id=\(placeId)&key=\(apiKey)" guard let url = URL(string: urlString) else { self.errorMessage = "Invalid URL" return } // 补充实际发起请求的代码(原代码仅创建URL,未发起请求) let task = URLSession.shared.dataTask(with: url) { [weak self] data, response, error in guard let data = data else { self?.errorMessage = error?.localizedDescription ?? "无返回数据" return } // 解析并处理JSON数据,用于展示 do { let jsonResult = try JSONSerialization.jsonObject(with: data, options: .allowFragments) // 此处可将jsonResult传递至UI层展示 print(jsonResult) } catch { self?.errorMessage = "JSON解析失败:\(error.localizedDescription)" } } task.resume() }
4. 检查项目计费状态
Places API为付费服务,即使有免费额度,未设置计费账户也会被拒绝请求:
- 进入Cloud控制台计费页,确认项目已绑定有效的计费账户
- 检查是否存在未结清账单导致服务受限
5. 排除网络环境问题
若使用代理或VPN,可能导致Google识别的IP异常,可暂时关闭代理测试请求是否正常。
排查技巧
先完全移除API密钥的所有限制(应用限制和API限制),确认请求能正常返回后,再逐步添加限制,即可定位到具体是哪种限制配置出了问题。
内容的提问来源于stack exchange,提问作者Yinzer111
相关产品推荐
相关产品推荐

