繁体   English   中英

在 Flutter 应用程序的源代码管理中隐藏 Google Maps API 密钥

[英]Hide Google Maps API key from source control in a Flutter app

要启用 Google Maps SDK,您必须使用 API 密钥更新: android/app/src/main/AndroidManifest.xml(用于 android)和ios/Runner/AppDelegate.m(用于 ios)。

问题:

我不想将我的 API 密钥签入源代码管理。

有没有办法用.env文件和.gitignore隐藏这个键?

这里的最佳实践是什么?

您可以将 api 密钥设置为只能在本地机器上构建期间读取的环境变量。 创建一个环境变量 MAPS_API_KEY="your-key-here",然后将这些行添加到 [your-project]/android/app/build.gradle

 defaultConfig {
        manifestPlaceholders = [mapsApiKey: "$System.env.MAPS_API_KEY"]
    }

然后您可以使用 mapsApiKeys 在 AndroidManifest.xml 中传递您的 api 密钥

 <meta-data android:name="com.google.android.geo.API_KEY"
                android:value="${mapsApiKey}"/>

对于 ios,将这些添加到 AppDelegate.m

NSString* mapsApiKey = [[NSProcessInfo processInfo] environment[@"MAPS_API_KEY"];

[GMSServices provideAPIKey:mapsApiKey];

您可以将密钥保存在单独的文件中,然后将该文件添加到.gitignore 然后,如果您将文件推送到存储库,该文件将被忽略。

如果您有新同事需要开始处理同一个项目,您将需要与他们共享此文件。 从存储库签出项目后,他们需要将该文件放在与原来相同的目录中。

从 Flutter 1.17 开始,您可以为此使用编译时变量。 只需在flutter runflutter build命令中使用--dart-define键即可。 然后您可以在您的 iOS 或 Android 代码中使用它们。 这是一篇带有一些解释和示例的文章

很长一段时间以来,我一直在我的 iOS 版 Flutter 应用程序中使用硬编码的 Google Maps API 密钥,但今天我决定一劳永逸地解决它,但即使阅读了许多文章和博文,我也没有找到解决方案这很简单。

然后我想我可以从AppDelegate.swift GoogleService-Info.plist文件中读取 API_KEY ,如下所示:

if let path = Bundle.main.path(forResource: "GoogleService-Info", ofType: "plist") {
    let nsDictionary = NSDictionary(contentsOfFile: path)
        
    if let apiKey = nsDictionary?["API_KEY"] as? String {
        print("AppDelegate: API_KEY found")
        GMSServices.provideAPIKey(apiKey)
    }
     

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM