iOS热更新探讨

过去的热修复以及被禁止的原因

1.最著名的JSPatch
JSPatch自2017年被禁已过去2年。(JSPatch官网:http://www.jspatch.com/)

他们自己可能还没放弃,还在寻求解决方案。

2.苹果对于热更新的驳回邮件

Your app, extension, and/or linked framework appears to contain code designed explicitly with the capability to change your app’s behavior or functionality after App Review approval, which is not in compliance with section 3.3.2 of the Apple Developer Program License Agreement and App Store Review Guideline 2.5.2. This code, combined with a remote resource, can facilitate significant changes to your app’s behavior compared to when it was initially reviewed for the App Store. While you may not be using this functionality currently, it has the potential to load private frameworks, private methods, and enable future feature changes.
This includes any code which passes arbitrary parameters to dynamic methods such as dlopen(), dlsym(), respondsToSelector:, performSelector:, method_exchangeImplementations(), and running remote scripts in order to change app behavior or call SPI, based on the contents of the downloaded script. Even if the remote resource is not intentionally malicious, it could easily be hijacked via a Man In The Middle (MiTM) attack, which can pose a serious security vulnerability to users of your app.
Please perform an in-depth review of your app and remove any code, frameworks, or SDKs that fall in line with the functionality described above before submitting the next update for your app for review.

您的应用程序,扩展程序和/或链接的框架似乎包含明确设计的代码,这些代码具有在App Review批准后可以更改应用程序的行为或功能的能力,这不符合Apple Developer Program许可协议和App的3.3.2节的规定。商店评论指南2.5.2。与最初在App Store上进行审核时相比,此代码与远程资源相结合可以促进对应用行为的重大更改。尽管您当前可能不使用此功能,但它可能会加载专用框架,专用方法并启用将来的功能更改。
这包括将任意参数传递给动态方法(例如dlopen(),dlsym(),responsToSelector :、 performSelector:,method_exchangeImplementations())以及运行远程脚本以更改应用程序行为或调用SPI的任何代码,这些代码基于以下内容下载的脚本。即使远程资源不是故意恶意的,也可以通过中间人(MiTM)攻击轻松劫持它,这会对您的应用程序用户造成严重的安全漏洞。
在为您的应用提交下一个更新供审核之前,请对您的应用进行深入的审查,并删除与上述功能一致的所有代码,框架或SDK。

主要涉及条款内容
苹果开发者计划使用协议3.3.2:

Except as set forth in the next paragraph, an Application may not download or install executable code. Interpreted code may only be used in an Application if all scripts, code and interpreters are packaged in the Application and not downloaded. The only exceptions to the foregoing are scripts and code downloaded and run by Apple's built-in WebKit framework or JavascriptCore, provided that such scripts and code do not change the primary purpose of the Application by providing features or functionality that are inconsistent with the intended and advertised purpose of the Application as submitted to the App Store.
除了下一段中所述,应用程序不得下载或安装可执行代码。 如果所有脚本,代码和解释器都打包在应用程序中而不下载,则解释的代码只能在应用程序中使用。 前述的唯一例外是由Apple的内置WebKit框架或JavascriptCore下载并运行的脚本和代码,但前提是这些脚本和代码不会通过提供与预期的和 提交给App Store的应用程序的广告目的。

App Store审核条款2.5.2:

Apps should be self-contained in their bundles, and may not read or write data outside the designated container area, nor may they download, install, or execute code, including other iOS, watchOS, macOS, or tvOS apps.
应用程序应包含在捆绑包中,并且不能在指定容器区域之外读取或写入数据,也不能下载,安装或执行代码,包括其他iOS,watchOS,macOS或tvOS应用程序。

结合苹果的回复,JSPatch被禁的原因:JSPatch可能在审核后更改应用程序的行为或功能。
但这一点,React Native一样可以做到。React Native也是JS调用OC原生组件

Apple之所以能揪出JSPatch,则是因为JSPatch中涉及使用到dlopen(),dlsym(),responsToSelector :、 performSelector:,method_exchangeImplementations()等方法。
但实际上我查过自己的项目,存在上述几个方法,依然能过审。所以推测被卡住的原因与这几个方法相关,但不必然相关。
PS:已确认dlsym()函数会触发苹果的监测,造成上线失败。

参阅JSPatch被拒之完美解决方案,文中认为苹果对动态API的检测应该是通过一个证据链来进行的,包含如下三个内容:

  1. 网络/下载功能
  2. 内置脚本引擎 (JSPatch等脚本引工擎具)
  3. 动态访问API

基于Aspects实现热修复

LYFix
LYFix介绍
LBYFix
HotFixGitub
Aspects框架详解
其实LYFix、LBYFix、HotFix这三者都是基于Aspects来实现的热修复功能。核心相同,只是不同程序员搬过去后,进行了针对性的补强。其中LYFix这个库算是补强程度最为全面。

简单的说下,这几个框架的实现热修复的逻辑。
step1:http下发一个js字符串
step2:解析这个字符串的第一层,看是执行在方法前方法后,还是整个替换方法
step3:根据第一层的解析结果,利用Aspects来hook原生方法
step4:利用JavaScriptCore框架,把第二层内容插入到原生方法中

注1:Aspects是面向切面编程的一个框架,它能允许你在每一个类和每一个实例中存在的方法里面加入任何代码。可以在方法执行之前或者之后执行,也可以替换掉原有的方法。通过Runtime消息转发实现Hook。
注2:LYFix、LBYFix、HotFix,均为18年的库,近两年未有人跟进维护。

其他热修复的方法:

MangoFix

MangoFix是为了解决iOS热修复问题的语法糖(DSL),它的语法和OC语法非常类似。
作者这就是做了一张全面的表,把MangoFix转为OC语言。
但是这个库我至今还未下载成功,待定。
MangoFixGitub
MangoFix简介
MangoFix原理

DynamicOC

这个与上面的MangoFix思想一致,使用flex/yacc进行词法解析和语法分析,转为一颗语法生成树AST。 然后通过解析每个节点,从而执行相应的代码。因为采用的是Objective-C作为脚本语言,因此极容易适配。
但是这个库调用C函数时会使用dlsym(),所以不推荐用这个库,容易爆雷。
DynamicOC

相关链接:
苹果的警告邮件内容(https://www.jianshu.com/p/6803d660f67e)
滴滴 iOS 动态化方案 DynamicCocoa(http://www.cocoachina.com/articles/18400)
热修复事件复盘
JSPatch被拒之完美解决方案(https://blog.csdn.net/hanhailong18/article/details/64443350)

你可能感兴趣的:(iOS热更新探讨)