在iOS开源项目中处理秘密

您是否曾经将敏感信息存储在远程版本控制存储库中? 确定您没有…

只需在GitHub上查看此链接

您的应用程序是否包含您不希望妈妈看到的任何秘密? 那么,为什么要把它放在网络上让大家高兴呢? 🙂

这篇文章不是要告诉您不要将凭据放在源代码控制上(但您不应这样做),而是要如何在Xcode项目上完成。

为了简洁起见,我们假设您从此处开始使用GitHub,

假设您有一个带有app / api / provider凭据的文件…虽然所有开发都保留在本地计算机上,但要使密钥远离Internet的肮脏之手是一件相当容易的事情。

您可以简单地将文件放在项目外部,然后在Xcode项目中引用它。 或者,您可以简单地将其添加到.gitignore文件中并继续。 这样,它将对您的构建可用,但对妈妈而言则无法从另一台计算机上看到。

现在,当您开始将CI添加到组合中时,此任务将变得更加复杂。 现在,您希望CI机器可以访问这些凭据,同时将它们排除在GitHub存储库之外。 那么我们该怎么做呢?

我的方法很简单,它使用默认情况下所有mac都已安装的工具,而且所有CI机器(至少支持Xcode项目的机器)也可能安装了该工具。 普通的老Ruby。

这个想法是让脚本加载ENV变量,并将其输入Xcode项目。 由于我们无法通过Xcode本身完成此任务,因此需要回退到手动脚本中。

开始吧:

假设您有一个带有凭据的简单文件。 这是我们很可能在常规项目中拥有的东西。

该脚本将尝试运行env-vars.sh文件,该文件将加载我们的凭据。 此文件存在于我们的本地计算机中,但不在CI计算机上。 在那里,它们已在配置中设置并可直接使用。 然后,ruby脚本完成其余的工作。 您需要为两个文件都输入正确的路径。

而已。 让我解释一下我们做了什么。

我们正在创建一个必须在“编译源代码”之前的构建阶段,这样您的项目才能毫无问题地进行编译。 其中包括一个脚本,该脚本创建一个Swift文件(填充凭据),通常您会手动执行该脚本,并从shell文件更新env var。

当编译器运行时,该文件已经存在并正常完成其工作。

每当我们提交到远程仓库时,这些文件就不会存在,因为它们会被忽略,因此不会暴露我们宝贵的凭证。

对于最后一步,您需要将ENV变量添加到CI提供程序。 对于Travis,您可以在其中设置区域。 您的脚本将提取ENV变量,创建文件,然后一切正常。 不要忘记密钥必须匹配!!!

希望本指南将使您在向项目添加机密时感到更自在,并且默认情况下不将其添加到GitHub。 这确实是一个坏习惯,即使从私有存储库中也应避免。

更新 :对于Xcode 10和新的构建系统,您需要考虑一些其他事项。 我将不在这里解释所有内容,而是指向这篇说明什么发生变化的文章。

现在,您需要将ruby脚本文件添加到输入文件列表,并将生成的swift文件添加到输出文件。 如果不这样做,由于新的构建系统可能正在paralell中运行脚本,因此它可能会在没有创建swift文件的情况下开始编译,这又会导致编译错误。

感谢蒂姆·罗斯纳指出这一点。

感谢Robin Malhotra在此解决方案中给我的启发。 他使用了模具和源代码,虽然我对它的依赖程度太高了,但他认为对于其他人也可以使用稍微简单一些的方法可能会有用。

让我知道您在下面的评论或https://twitter.com/goncalvescmnuno中对此有何想法