好吧,我对iOS编程来说一定是一个难以忍受的小问题,无论是使用API还是一般使用XCode,因为显然将我程序中的API-Keys更改为任何类型的受限API密钥会破坏我的程序。
我正在使用flutter构建我的应用程序(用VSCode编写大部分代码(。
在我的pubspec.yaml中,我有以下依赖项(只是以防万一它是相关的(。
dependencies:
flutter:
sdk: flutter
firebase_auth: ^0.15.4
google_sign_in: ^4.1.4
firebase_core: 0.4.4
google_maps_flutter: ^0.5.24+1
geolocator: ^5.3.0
flutter_google_places: ^0.2.4
geocoder: ^0.2.1
http: ^0.12.0+4
intl: ^0.16.1
如果我的程序使用不受限制的Web API密钥,作为googleMapKay,我就没有问题,下面的代码工作得很好。
Future<void> _originAutocomplete() async {
Prediction p = await PlacesAutocomplete.show(
context: context,
apiKey: googleMapKey,
mode: Mode.overlay,
language: "en",
location: new Location(last_known_position.latitude, last_known_position.longitude),
radius: 100000,
components: []);
if (p == null) {
print('p is null');
}
originSelected(p);
}
然而,如果我对同一行使用ios-app-Restricted API-Key,p会突然变为null。现在我正在使用firebase,并且我已经在程序中正确地包含了GoogleServices.plist。我已经在XCode中的AppDelegate.swift中更新了API-Key,也更新了程序本身中的API-Key。
我一直在各种设备上测试这一点,iphone se、5s、8+,以及ipad pro 12.9"(第三代(和iphone 11 pro max的模拟器。在所有情况下,我都有同样的错误,并且在使用不受限制的web API时修复了这一错误,我无法在产品的最终版本中使用。
我还验证了Restricted API-Key设置为仅通过iOS应用程序进行限制,并且该程序的bundle-identifier在google API-Key限制中设置正确。(而且只有应用程序限制,没有api限制(。所以我不认为这是问题所在,但如果你能给我展示一种测试方法,我将不胜感激!经过一点测试,我发现AppDelegate文件中的密钥副本似乎无关紧要,因此可以毫无问题地限制密钥。
在查看了flatter_google_places的文档后,显然这与谷歌_maps_webservices有着内在的依赖性,它需要一个web api才能发挥作用。(如果我理解正确,这意味着不受限制的密钥?(。这确实说明了"正确"的行业最佳实践是使用代理服务器?
我不100%熟悉这个过程,也不熟悉如何做到这一点,也不知道是否有任何简单或简单的方法可以让它发挥作用,所以如果你能提供任何帮助,我们将不胜感激!
谷歌地图平台API需要在请求中包含API密钥才能正常工作。建议对API密钥设置限制,以保护您的密钥。请注意,您可以对API密钥使用不同类型的限制,这些限制应与使用它的适当服务相匹配,否则会引发错误。
我可以看到,您正在使用Google places自动完成窗口小部件进行flutter,这似乎使用了places Web服务API。请注意,Places Webservice API与iOS限制不兼容,因为只能使用此限制的API/SDK是适用于iOS的Places SDK和适用于iOS的Maps SDK。这可能是您在使用受iOS限制的API密钥时出现问题的原因。你可以考虑只使用API限制,并使用你的flutter应用程序正在使用的谷歌地图平台API来限制你的密钥。
此外,在使用Web Service API的移动应用程序上,您可以考虑以下技术来保护您的API密钥:使用代理服务器,混淆或加密API密钥或签名密钥,并使用CA钉扎或证书钉扎来验证服务器资源是否有效。这些内容将在本链接中讨论。