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

Posted

技术标签:

【中文标题】在 Flutter 应用程序的源代码管理中隐藏 Google Maps API 密钥【英文标题】:Hide Google Maps API key from source control in a Flutter app 【发布时间】:2019-12-25 19:24:30 【问题描述】:

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

问题:

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

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

这里的最佳做法是什么?

【问题讨论】:

也许this 能帮上忙?至少对于 android,将其隐藏在 gradle.properties 文件中 看起来这可能是 android 的答案,然后在 ios 中类似。我希望有一种方法可以使用飞镖注入密钥,但是????‍♂️ 如果您的密钥得到妥善保护,为什么需要隐藏它? developers.google.com/maps/api-key-best-practices @MrUpsidown 我不确定你的意思。该文档说“不要将 API 密钥直接嵌入代码中”。和“使用环境变量”。我的问题是:你如何在颤振项目中做到这一点? 对,他们确实这么说。对于网页,无论如何您都无法隐藏密钥。对于移动应用程序,您应该/必须应用一些限制(包名称、证书等)。不想在源代码控制中看到它是有道理的,但如果它由于某种原因被公开发布,你仍然应该是安全的。但是很抱歉,我不能告诉你如何在颤振中做到这一点;不是我的地区。 【参考方案1】:

您可以将您的 api 密钥设置为环境变量,只能在本地计算机上构建期间读取。创建一个环境变量 MAPS_API_KEY="your-key-here",然后将这些行添加到 [你的项目]/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];

【讨论】:

如何创建环境变量? 您可以在终端输入MAP_API_KEY=some-valueSOMEVARIABLE=some-value 来创建它们 好的。这就是我所做的,但不确定。谢谢。另外,当我构建然后部署应用程序时,任何人都无法通过反编译我的应用程序来查看密钥?太棒了! 我尝试在 Windows 上使用 Powershell $Env:MAPS_API_KEY = "&lt;api-key&gt;" 遵循这个秘诀,并在 Android Studio 中运行时得到 API Key: null 我使用的是 linux,所以我不知道在 powershell 中是否设置了名为 MAPS_API_KEY 的环境变量。这就是你想要做的吗?【参考方案2】:

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

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

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

长期以来,我一直在我的 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)
    
     

【讨论】:

以上是关于在 Flutter 应用程序的源代码管理中隐藏 Google Maps API 密钥的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Flutter WebView 中注入一个简单的代码来隐藏网站的一部分(页脚)?

在 Flutter 应用程序中的 ListView 滚动上隐藏/关闭键盘

如何在 Flutter 中使用 GestureDetector 隐藏 appBar?

如何在 Flutter 的 webview 中隐藏页眉和页脚。?

在 Flutter 中隐藏/删除状态栏(点击按钮)

4.Flutter生命周期与路由管理