有关ios热修复的讨论有很多,尝试了原生动态库,JSPath,react native三种方式。这三种方式我都尝试了一下,确实适应场景各有不同。
先说下动态库方案吧,动态库方案无疑是最完美的方案。动态库无需编译至二进制文件中,可以在程序运行中再执行动态库中的代码。这样即可实现热更新。但是,苹果不允许动态下发可执行代码。所以这样加载动态库是被禁止的。然而,这个漏洞是在ios10才被苹果修复,所以ios10以下手机是可以利用此方案进行热更的。
下面说一下具体实现,先制作一个动态库dylib(也可用本人的https://github.com/duanran/plugDylib.git)。然后还需要一个宿主应用,在宿主应用中下载dylib至Document目录下,然后用dlopen打开动态库。然后就可以执行dylib里面的代码了。(宿主应用地址:https://github.com/duanran/DylibTest.git)
需要注意的是,动态库dylib签名一定要和你的宿主app一致,否则会报错。模拟器不验证签名,可以正常执行。
ios10以后苹果加强了权限管理,dlopen方法无法打开Doucument目录下的dylib了。至今还未找到如何绕开权限执行的方法。