React Native安卓应用受限Google API Key下Autocomplete服务异常问题
核心原因
1. 请求来源的验证逻辑不同
地图组件(如MapView)通过Google Maps SDK for Android发起本地请求,会自动携带应用的包名和SHA-1签名信息,完全符合Android密钥限制的验证规则,因此能正常访问。而Place Autocomplete服务在多数React Native实现中,是通过HTTP API直接调用发起请求,这类请求不会自动附加安卓应用的签名和包名,导致受限密钥无法验证请求合法性,直接拦截。
2. API服务的限制范围不匹配
部分React Native的Autocomplete库依赖Web端的Place API端点,而Android密钥限制仅对安卓SDK发起的请求生效,对Web/HTTP API请求不兼容,所以启用限制后这类请求会被拒绝。
解决步骤
确保Autocomplete请求携带验证参数
如果是直接调用HTTP API,必须在请求中手动添加packageName和signature参数,参数值要和密钥限制中配置的包名、SHA-1签名完全一致。示例参数:https://maps.googleapis.com/maps/api/place/autocomplete/json?input=上海&key=YOUR_RESTRICTED_KEY&packageName=com.your.app.id&signature=AA:BB:CC:...(你的SHA-1签名)如果使用的是原生Places SDK封装的RN库,检查安卓端是否正确初始化SDK,确保请求自动携带验证信息。
检查密钥的API权限配置
登录Google Cloud控制台,确认受限密钥已经启用了Place Autocomplete API和Places API,避免只开启了Maps SDK for Android而漏开Places相关服务。核对签名与包名的一致性
确认密钥限制中配置的包名、SHA-1签名和当前构建应用使用的签名完全匹配(注意debug和release签名的区别:debug签名默认由Android Studio生成,release签名是你自己的密钥文件)。可以用keytool命令查看签名:keytool -list -v -keystore ./your-keystore.jks -alias your-alias-name替换为原生封装的Places库
放弃HTTP API调用,改用基于Google Places SDK for Android封装的React Native库(如react-native-google-places),这类库会自动遵循安卓密钥的限制规则,无需手动处理验证参数。
内容的提问来源于stack exchange,提问作者rafik

