如何为 iOS (SWIFT) 个项目隐藏 GitHub 中的 API 键?

How to hide API keys in GitHub for iOS (SWIFT) projects?

您好,我正在尝试在 GitHub 中发布一个 iOS (SWIFT) 个人项目,但我害怕分享我的私人 API 密钥和秘密和大家一起。

我正在使用解析,所以我的 AppDelegate 中有这样的东西:

let applicationId = "mySecretApplicationId"
let clientKey = "mySecretClientKey"
Parse.setApplicationId(applicationId!, clientKey: clientKey!)

我想隐藏 "mySecretApplicationId" 和 "mySecretClientKey",我的项目中是否有私人地方或目录可以放置这些变量?

谢谢!

将它们放入您添加到 .gitignore 文件的配置文件中。签入每个开发人员都可以用来创建自己的配置的示例配置文件。

您可以使用 .plist 文件来存储所有重要的密钥。将此文件放入您的 .gitignore 文件非常重要。

在您的情况下,您需要像这样设置 keys.plist 文件:

并在您的 AppDelegate 中使用它,如下所示:

    var keys: NSDictionary?

    if let path = NSBundle.mainBundle().pathForResource("Keys", ofType: "plist") {
        keys = NSDictionary(contentsOfFile: path)
    }
    if let dict = keys {
        let applicationId = dict["parseApplicationId"] as? String
        let clientKey = dict["parseClientKey"] as? String

        // Initialize Parse.
        Parse.setApplicationId(applicationId!, clientKey: clientKey!)
    }

SWIFT 3 次更新:

 if let path = Bundle.main.path(forResource: "Keys", ofType: "plist") {
        keys = NSDictionary(contentsOfFile: path)
    }

如果您想在没有密钥的情况下共享您的项目,那么:

  1. 添加键(如您所愿 - 枚举、结构,甚至 object/singleton)
struct Keys {
    static let sandboxToken = "Tpk_hh43nneu3jwsu3u"
    static let productionToken = "pk_b5h4uend8ejwnw8"
}
  1. 在您的代码中添加以下代码:
extension APIManager {
    enum Environment {

        case sandbox, production

        var apiKey: String {
            switch self {
            case .sandbox:
                return Keys.iexSandboxToken // <- Here

            case .production:
                return Keys.iexProductionToken // <- Here
            }
        }
    }
}

或者如果你想处理可选项,那么你可以添加类似于以下内容的内容:

struct Keys {
    static let sandboxToken: String? = "Tpk_hh43nneu3jwsu3u"
    static let productionToken: String?
}

并在使用时添加断言

        var apiKey: String {
            switch self {
            case .sandbox:
                guard let token = Keys.iexSandboxToken else {
                    assertionFailure("Please fill the tokent in Keys.swift")
                    return "anything you want"
                }
                return token

            case .production:
                guard let token = Keys.iexProductionToken else {
                    assertionFailure("Please fill the tokent in Keys.swift")
                    return "anything you want"
                }
                return token
            }
        }

因此,在生产中,它会失败。

  1. 将其添加到 .gitignore。所以,你的钥匙被隐藏了。