设计热更新方案
问题
iOS 端如何实现热更新(Hot Fix)?
答案
方案对比
| 方案 | 原理 | 审核风险 | 适用场景 |
|---|---|---|---|
| JSPatch | OC Runtime + JS 脚本 | ⚠️ 高(已被禁) | - |
| JavaScriptCore | 内嵌 JS 引擎 | 中 | 逻辑修复 |
| React Native 热更 | CodePush 下发 JS Bundle | 低 | RN 页面 |
| WebView H5 | 远程加载 Web 页面 | 无 | H5 页面 |
| 动态配置 + Feature Flag | 服务端开关 | 无 | 功能降级 |
| Lua 脚本 | 嵌入 Lua 执行 | 中 | 游戏 |
Apple 审核
Apple 明确禁止下载可执行代码(3.2.2)。JSPatch 类方案已被大规模拒审。合规的方式是 JavaScriptCore 执行纯逻辑或通过 Web 容器更新 UI。
合规热修复方案
// 方案一:Feature Flag 降级
class HotFixManager {
func shouldUseFixedVersion(for feature: String) -> Bool {
RemoteConfig.shared.getBool("hotfix_\(feature)", default: false)
}
}
// 方案二:JavaScriptCore 执行逻辑
import JavaScriptCore
class JSHotFix {
private let context = JSContext()!
func loadPatch(script: String) {
context.evaluateScript(script)
}
func callFunction(_ name: String, args: [Any]) -> JSValue? {
context.objectForKeyedSubscript(name)?.call(withArguments: args)
}
}
常见面试问题
Q1: iOS 在审核合规前提下能做什么程度的热更新?
答案:严格来说只能通过 Remote Config/Feature Flag 做功能开关、降级兜底。WebView 加载远端 H5 天然支持更新。React Native 的 CodePush 目前审核可过,但不能改变 App 主要用途。原生代码的真正热更在 iOS 上基本不可行。