SwiftyRemoteConfig 0.1.1

SwiftyRemoteConfig 0.1.1

fumitoito 维护。



SwiftyRemoteConfig

Platforms CocoaPods compatible Carthage compatible SPM compatible Swift version Swift version Swift version

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!再次,与 CodableNSCoding 的情况相同

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 文件。