CRUConfig 是 dotenv 的 objc 实现。它提供了一个包装器用于 config.plist,为您提供了一个从代码中获取 API 密钥和 URL 的简单方法,同时您的 IDE 现在会自动补全您的值,因为它们现在是属性而不是字符串。它还基于环境,因此您可以定义不同构建配置的不同配置文件。(不确定什么是构建配置,请阅读 这里)
一旦它选择了适合您的环境的正确文件,它将自动将该文件值加载到您的配置类中,同时自动将值转换为匹配您类属性类型的值。
继续阅读以了解它的工作原理以及如何使用它.
CRUConfig 通过 CocoaPods 提供。要安装它,只需将以下行添加到您的 Podfile 中
pod "CRUConfig"
要运行示例项目,请克隆仓库,然后首先从 Example 目录运行 pod install
。
创建 CRUEmptyConfig
的子类,并将配置值作为属性添加。该 Pod 将自动从您的配置文件将值加载到属性中,包括将其转换为正确的类型。请参阅下面的部分,以了解自动加载的工作原理、自动加载规则以及如何处理异常情况,高级加载。
在子类的头文件中添加您希望在代码中使用的不想要的属性。例如。
#import "CRUEmptyConfig.h"
@interface MYConfig : CRUEmptyConfig
@property (nonatomic, strong, readonly) NSURL *baseUrl;
@property (nonatomic, strong, readonly) NSString *myAPISecret;
@end
通过代码使用环境特定的配置值
myAPI.baseURL = [MYConfig sharedConfig].baseURL;
或者
MYAPI *myAPI = [MYAPI apiWithConfig:[MYConfig sharedConfig]];
不确定什么是构建配置,请阅读 这里
Pod将寻找与当前配置名称匹配的配置文件。例如,如果您正在构建调试配置,它将在您的应用程序束中寻找config.debug.plist。如果您使用发布配置构建目标,它将寻找config.release.plist。如果您为您的项目创建一个名为beta的定制配置,并且构建使用该配置,Pod将寻找config.beta.plist。请注意,它们总是小写。
如果您不想为特定配置创建配置文件,只需使用config.default.plist或config.plist。
优先级顺序如下
所有项目至少有2个构建配置:Debug
和Release
。如果您创建与当前构建配置匹配的配置文件,CRUConfig将尝试加载相关的plist文件。
如果您的构建使用名为Adhoc
的构建配置,您应创建一个包含您的adhoc特定值(例如,base_url
为stage.api.example.com
)的config.adhoc.plist
文件,然后当您构建adhoc构建时,所有针对[CRUConfig sharedConfig].baseURL
的引用都将指向您的测试服务器。在您的config.release.plist
文件中,您可以将base_url
定义为api.example.com
,这样发布构建将自动指向您的生产服务器。
您可以为项目中的每个构建配置创建配置文件,即使是为定制配置。如果您没有使用任何针对构建配置特定的配置文件,Pod将回退到config.default.plist
或config.plist
。
它将按以下顺序尝试访问文件
config.debug.plist
,即使在项目的配置名称中有大写字母,文件名也始终使用小写)config.default.plist
config.default.plist
,它将尝试config.plist
您可能会在每个项目的不同类型中需要各种不同的配置值。为了解决这一问题,CRUConfig试图将您的plist键与属性名匹配。
它将尝试寻找直接匹配,然后它将尝试将您的plist键从蛇形转义格式转换为驼峰格式,并寻找匹配的属性。例如:
配置文件键 | 属性名称 | 匹配 |
---|---|---|
baseURL | baseURL | |
my_super_secret | mySuperSecret | |
base_url | baseUrl | |
google_api_key | apiKeyGoogle |
它已经找到与键匹配的属性后,将尝试将值转换为属性的类型。以下是转换的规则。如果找不到属性或值无法转换或加载,则跳过plist条目,并且您的属性将保留其默认值,通常是nil。
配置文件类型 | 可能的属性类型 | 注意 |
---|---|---|
数组 |
NSArray ,NSSet |
|
字典 |
|
|
布尔值 |
|
|
数据 |
NSData ,NSString |
使用UTF8编码进行转换 |
日期 |
NSDate ,NSString |
使用yyyy-MM-dd HH:mm:ss zzz 日期格式进行日期转换(可以通过覆盖NSObject+PropertyTypeMatching类别中的dateFormat方法进行更改),如果您想要将日期作为字符串,则时区默认为GMT(它与UTC相同,但苹果拒绝称之为UTC。要更改默认时区,请覆盖NSObject+PropertyTypeMatching类别中的timeZone方法) |
数字 |
NSNumber ,NSString |
使用数字的stringValue方法进行字符串转换 |
字符串 |
NSString ,NSURL ,NSDate ,NSData ,NSNumber |
使用UTF8编码进行数据转换,使用yyyy-MM-dd HH:mm:ss zzz 日期格式进行日期转换(可以通过在NSObject+PropertyTypeMatching类别中重写dateFormat方法进行更改),存储数字时使用双精度表示 |
注意,仅支持NS Foundation类型。如果您需要将值加载到原始类型或您的值拒绝加载,请查看高级加载部分,以获取手动加载这些值的方法。
例如,如果这是您的plist文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>myAPISecret</key>
<string>api-secret-1</string>
<key>base_url</key>
<string>localhost:8080</string>
</dict>
</plist>
并且这是您的配置类
#import "CRUEmptyConfig.h"
@interface MYConfig : CRUEmptyConfig
@property (nonatomic, strong, readonly) NSURL *baseUrl;
@property (nonatomic, strong, readonly) NSString *myAPISecret;
@property (nonatomic, strong, readonly) NSNumber *loading;
@end
baseUrl将有一个包含地址localhost:8080的NSURL对象,myAPISecret将有一个NSString
那么在您的.m
文件中包含CRUConfig+setter.h
文件,以便您可以子类化- (void)setPropertiesWithContentsOfConfigDictionary:(NSDictionary *)configDictionary
方法。在这里,您将获得一个包含已加载的plist文件内容的字典。在这个方法中,您应对值进行验证,然后将其设置为为您的配置值创建的正确属性。以下是一个示例
#import "CRUConfig.h"
#import "CRUConfig+setter.h"
@implementation CRUConfig
- (void)setPropertiesWithContentsOfConfigDictionary:(NSDictionary *)configDictionary {
NSString *baseUrlString = configDictionary[@"base_url"] ?: @"";
_baseUrl = [NSURL URLWithString:baseUrlString];
_myAPISecret = configDictionary[@"my_api_secret"] ?: @"";
}
@end
现在您可以在代码中使用配置类
myAPI.baseURL = [CRUConfig sharedConfig].baseURL;
或者
MYAPI *myAPI = [MYAPI apiWithConfig:[CRUConfig sharedConfig]];
如果您不确定什么是构建配置,这篇文章解释了它们是什么https://developer.apple.com/library/ios/recipes/xcode_help-project_editor/Articles/BasingBuildConfigurationsonConfigurationFiles.html。如果您已经是构建配置了,还不清楚为什么需要CRUConfig。构建配置允许您定义在构建时需要的值和设置,而CRUConfig中的值在运行时可用。
Harro,[email protected]
CRUConfig可用在MIT许可证下。有关更多信息,请参阅LICENSE文件。