跳到主要内容

设计热更新方案

问题

iOS 端如何实现热更新(Hot Fix)?

答案

方案对比

方案原理审核风险适用场景
JSPatchOC Runtime + JS 脚本⚠️ 高(已被禁)-
JavaScriptCore内嵌 JS 引擎逻辑修复
React Native 热更CodePush 下发 JS BundleRN 页面
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 上基本不可行。

相关链接