如何为 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)
}
如果您想在没有密钥的情况下共享您的项目,那么:
- 添加键(如您所愿 - 枚举、结构,甚至 object/singleton)
struct Keys {
static let sandboxToken = "Tpk_hh43nneu3jwsu3u"
static let productionToken = "pk_b5h4uend8ejwnw8"
}
- 在您的代码中添加以下代码:
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
}
}
因此,在生产中,它会失败。
- 将其添加到 .gitignore。所以,你的钥匙被隐藏了。
您好,我正在尝试在 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)
}
如果您想在没有密钥的情况下共享您的项目,那么:
- 添加键(如您所愿 - 枚举、结构,甚至 object/singleton)
struct Keys {
static let sandboxToken = "Tpk_hh43nneu3jwsu3u"
static let productionToken = "pk_b5h4uend8ejwnw8"
}
- 在您的代码中添加以下代码:
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
}
}
因此,在生产中,它会失败。
- 将其添加到 .gitignore。所以,你的钥匙被隐藏了。