SwiftyRemoteConfig
是 FirebaseRemoteConfig
的现代 Swift API
SwiftyRemoteConfig 通过结合表达式的 Swifty API 和静态类型的好处,使得 Firebase Remote Config 的使用变得愉快。这个库受到 SwiftyUserDefaults 的强烈启发。
特性
使用 SwiftyRemoteConfig 只需一步。
指定您的密钥!
extension RemoteConfigKeys {
var recommendedAppVersion: RemoteConfigKey<String?> { .init("recommendedAppVersion")}
var isEnableExtendedFeature: RemoteConfigKey<Bool> { .init("isEnableExtendedFeature", defaultValue: false) }
}
... 然后就可以使用了!
// get remote config value easily
let recommendedVersion = RemoteConfigs[.recommendedAppVersion]
// eality work with custom deserialized types
let themaColor: UIColor = RemoteConfigs[.themaColor]
如果您使用 Swift 5.1 或更高版本,您还可以使用 keyPath dynamicMemberLookup
let subColor: UIColor = RemoteConfigs.subColor
使用方法
指定您的密钥
要充分利用 SwiftyRemoteConfig,请提前指定远程配置密钥
let flag = RemoteConfigKey<Bool>("flag", defaultValue: false)
只需创建一个 RemoteConfigKey
对象。如果您想要一个非可选值,只需在键中提供 defaultValue
(请参阅上面的示例)。
现在您可以使用 RemoteConfig
短路访问这些值
RemoteConfigs[key: flag] // => false, type as "Bool"
编译器不会让您方便地返回 Bool
。
使用快捷方式
为了提供额外便利,通过扩展 RemoteConfigKeys
类并添加静态属性来定义您的键
extension RemoteConfigKeys {
var flag: RemoteConfigKey<Bool> { .init("flag", defaultValue: false) }
var userSectionName: RemoteConfigKey<String?> { .init("default") }
}
并使用快捷方式点语法
RemoteConfigs[\.flag] // => false
支持类型
SwiftyRemoteConfig 支持以下标准类型
单个值 | 数组 |
---|---|
字符串 |
[String] |
Int |
[Int] |
Double |
[Double] |
Bool |
[Bool] |
Data |
[Data] |
Date |
[Date] |
URL |
[URL] |
[String: Any] |
[[String: Any]] |
而且不仅仅如此!
扩展现有类型
Codable
SwiftyRemoteConfig
支持 Codable
!只需在您的类型中遵循 RemoteConfigSerializable
final class UserSection: Codable, RemoteConfigSerializable {
let name: String
}
无需实现!这样做,您将获得指定可选 RemoteConfigKey
的选项
let userSection = RemoteConfigKey<UserSection?>("userSection")
此外,您还可以免费获得数组支持
let userSections = RemoteConfigKey<[UserSection]?>("userSections")
NSCoding
以与支持 Codable 相同的方式支持您的自定义 NSCoding 类型
final class UserSection: NSObject, NSCoding, RemoteConfigSerializable {
...
}
RawRepresentable
最后,支持 RawRepresentable
!再次,与 Codable
和 NSCoding
的情况相同
enum UserSection: String, RemoteConfigSerializable {
case Basic
case Royal
}
自定义类型
如果您想添加我们尚未支持的自定义类型,我们已为您准备好解决方案。我们使用多种类型的RemoteConfigBridge
来指定如何获取值和值数组。当您查看RemoteConfigSerializable
协议时,它期望每种类型中都有两个属性:_remoteConfig
和_remoteConfigArray
,两者都是RemoteConfigBridge
类型。
例如,这是一个使用NSKeyedUnarchiver
获取单个值数据的桥梁。
public struct RemoteConfigKeyedArchiveBridge<T>: RemoteConfigBridge {
public func get(key: String, remoteConfig: RemoteConfig) -> T? {
remoteConfig.data(forKey: key).flatMap(NSKyedUnarchiver.unarchiveObject) as? T
}
public func deserialize(_ object: RemoteConfigValue) -> T? {
guard let data = object as? Data else {
return nil
}
NSKyedUnarchiver.unarchiveObject(with: data)
}
}
默认获取数组值的桥梁。
public struct RemoteConfigArrayBridge<T: Collection>: RemoteConfigBridge {
public func get(key: String, remoteConfig: RemoteConfig) -> T? {
remoteConfig.array(forKey: key) as? T
}
public func deserialize(_ object: RemoteConfigValue) -> T? {
return nil
}
}
现在,要在您的类型中使用这些桥梁,您只需声明如下:
struct CustomSerializable: RemoteConfigSerializable {
static var _remoteConfig: RemoteConfigBridge<CustomSerializable> { RemoteConfigKeyedArchiverBridge() }
static var _remoteConfigArray: RemoteConfigBridge<[CustomSerializable]> { RemoteConfigKeyedArchiverBridge() }
let key: String
}
不幸的是,如果您发现自己需要自定义桥梁,您可能需要自己编写。
final class RemoteConfigCustomBridge: RemoteConfigBridge {
func get(key: String, remoteConfig: RemoteConfig) -> RemoteConfigCustomSerializable? {
let value = remoteConfig.string(forKey: key)
return value.map(RemoteConfigCustomSerializable.init)
}
func deserializa(_ object: Any) -> RemoteConfigCustomSerializable? {
guard let value = object as? String {
return nil
}
return RemoteConfigCustomSerializable(value: value)
}
}
final class RemoteConfigCustomArrayBridge: RemoteConfigBridge {
func get(key: String, remoteConfig: RemoteConfig) -> [RemoteConfigCustomSerializable]? {
remoteConfig.array(forKey: key)?
.compactMap({ $0 as? String })
.map(RemoteConfigCustomSerializable.init)
}
func deserializa(_ object: Any) -> [RemoteConfigCustomSerializable]? {
guard let values as? [String] else {
return nil
}
return values.map({ RemoteConfigCustomSerializable.init })
}
}
struct RemoteConfigCustomSerializable: RemoteConfigSerializable, Equatable {
static var _remoteConfig: RemoteConfigCustomBridge { RemoteConfigCustomBridge() }
static var _remoteConfigArrray: RemoteConfigCustomArrayBridge: { RemoteConfigCustomArrayBridge() }
let value: String
}
为了支持具有不同桥梁的现有类型,您可以以类似的方式扩展它。
extension Data: RemoteConfigSerializable {
public static var _remoteConfigArray: RemoteConfigArrayBridge<[T]> { RemoteConfigArrayBridge() }
public static var _remoteConfig: RemoteConfigBridge<T> { RemoteConfigBridge() }
}d
此外,请查看我们的源代码或测试,以查看更多桥梁示例。如果您对这些桥梁感到困惑,请创建一个问题,我们将想办法解决。
属性包装器
SwiftyRemoteConfig为Swift 5.1提供了属性包装器!属性包装器@SwiftyRemoteConfig
提供了一种使用键路径的方法。
注意:这个属性包装器只支持read
。您可以设置属性的新值,但任何更改都不会反映到远程配置的值上
使用说明
给定键
extension RemoteConfigKeys {
var userColorScheme: RemoteConfigKey<String> { .init("userColorScheme", defaultValue: "default") }
}
您可以声明一个Settings结构体
struct Settings {
@SwiftyRemoteConfig(keyPath: \.userColorScheme)
var userColorScheme: String
}
KeyPath动态成员查找
SwiftyRemoteConfig使KeyPath dynamicMemberLookup在Swift 5.1中可用。
extension RemoteConfigKeys {
var recommendedAppVersion: RemoteConfigKey<String?> { .init("recommendedAppVersion")}
var themaColor: RemoteConfigKey<UIColor> { .init("themaColor", defaultValue: .white) }
}
并且只需要这样使用它 ;-)。
// get remote config value easily
let recommendedVersion = RemoteConfig.recommendedAppVersion
// eality work with custom deserialized types
let themaColor: UIColor = RemoteConfig.themaColor
依赖项
- Swift 版本 >= 5.0
软件开发工具包(SDKs)
- iOS 版本 >= 11.0
- macOS 版本 >= 10.12
- tvOS 版本 >= 12.0
- watchOS 版本 >= 6.0
框架
- Firebase iOS SDK >= 8.0.0
安装
Cocoapods
如果您使用 Cocoapods,只需在您的 Podfile
中添加此行
pod 'SwiftyRemoteConfig`, `~> 0.1.1`
通过在终端运行此命令进行安装
$ pod install
然后,在所有使用库的文件中导入此库
import SwiftyRemoteConfig
Carthage
只需添加您的 Cartfile
github "fumito-ito/SwiftyRemoteConfig" ~> 0.1.1
Swift 包管理器
只需将 SwiftyRemoteConfig 添加到依赖项下的 Package.swift
let package = Package(
name: "MyPackage",
products: [...],
dependencies: [
.package(url: "https://github.com/fumito-ito/SwiftyRemoteConfig.git", .upToNextMajor(from: "0.1.1"))
]
)
SwiftyRemoteConfig 遵循 Apache License 2.0 协议。有关详细信息,请参阅 LICENSE 文件。