设计动态配置系统
问题
如何设计 iOS 端的动态配置系统(Remote Config)?
答案
三级回退
实现
class RemoteConfig {
static let shared = RemoteConfig()
private var memoryCache: [String: Any] = [:]
private let defaults: [String: Any] // 代码内置默认值
init(defaults: [String: Any] = [:]) {
self.defaults = defaults
// 启动时从 UserDefaults 加载上次的远程配置
loadFromDisk()
}
func getValue<T>(_ key: String, type: T.Type = T.self) -> T? {
// 1. 内存缓存 → 2. 磁盘缓存 → 3. 默认值
(memoryCache[key] as? T) ?? (diskCache[key] as? T) ?? (defaults[key] as? T)
}
func fetch() async {
guard let config = try? await API.fetchRemoteConfig() else { return }
memoryCache = config
saveToDisk(config)
}
// Bool 便捷方法
func getBool(_ key: String, default: Bool = false) -> Bool {
getValue(key, type: Bool.self) ?? `default`
}
}
// 使用
if RemoteConfig.shared.getBool("feature_new_home", default: false) {
showNewHome()
}
灰度下发
// 服务端配置结构
struct ConfigRule: Codable {
let key: String
let value: Any
let conditions: [Condition] // 灰度条件
struct Condition: Codable {
let type: String // "userId", "version", "percentage"
let operator_: String
let value: String
}
}
常见面试问题
Q1: 配置更新但 App 还在前台,何时生效?
答案:方案一:定时轮询(如每 5 分钟)。方案二:App 从后台回前台时拉取。方案三:Server Push(静默推送触发)。关键配置可以通过静默推送实时下发。