布景
关于appstore的审阅周期不确认性,可长到2星期,短到1天。假设线上的运用呈现了一些bug,甚至是致命的溃散,这时分假设依照苹果的套路乖乖重新发布一个版别,然后静静等待看似漫无期限的审阅周期,终究成果就是:用户很多丢失。因而,关于一些线上的bug,需求有及时修正的才干,这就是所谓的热修正(hotfix)。
随着迭代频繁或许次数的增多,运用呈现功用异常或不可用的情况也会随之增多。这时分又有什么办法能够快速解决线上的问题呢?榜首、在一开始功用规划的时分就规划降级计划,但随之开发本钱和测验本钱都会双倍增加;第二、每个功用加上开关配置,这样治标不治本,当开关关掉的时分,就意味着用户无法运用该功用。这时分热修正就是解决这种问题的最佳之选,既能修正问题,又能让用户无感知,一举两得。iOS热修正技能从最初的webView到最近的SOT,技能的开展越来越快,新技能现已到来:
一.首要是原理篇MangoFix:(知道原理才干更好的干活)
热修正的中心原理:
1.阻拦方针办法调用,让其调用转发到预先埋好的特定办法中
1.获取方针办法的调用参数
只需完成了上面两步,你就能够为所欲为了。在任意发挥前,你需求把握一些Runtime的基础理论,
Runtime能够在运转时去动态的创立类和办法,因而你能够经过字符串反射的办法去动态调用OC办法、动态的替换办法、动态新增办法等等。下面简略介绍下热修正所需求用到的Runtime知识点。
OC音讯转发机制
由上图音讯转发流程图能够看出,体系给了3次时机让咱们来拯救。
榜首步,在resolveInstanceMethod办法里经过class_addMethod办法来动态增加未实现的办法;
第二步,在forwardingTargetForSelector办法里回来备用的接受者,经过备用接受者里的实现办法来完成调用;
第三步,体系会将办法信息打包进行终究的处理,在methodSignatureForSelector办法里能够对自己实现的办法进行办法签名,经过获取的办法签名来创立转发的NSInvocation方针,然后再到forwardInvocation办法里进行转发。
办法替换就运用第三步的转发进行替换。
当然现在有现成的,初级及以上iOS开发工程师很快就能够理解的语法剖析,大约了解一下mangofix是能够转化oc和swift代码的:详细详情请看
www.jianshu.com/p/7ae91a2da…
那么为什么它能够履行转化呢,转化逻辑是什么?
MangoFix项目主页上中现已讲到,MangoFix既是一个iOS热修正SDK,但一起也是一门DSL(范畴专用言语),即iOS热修正范畴专用言语。既然是一门言语,那必定要有相应的编译器或许解析器。相关于编译器,运用解析器实现言语的履行,虽然功率低了点,但明显愈加简略和灵敏,所以MangoFix挑选了后者。下面咱们先用一张简略流程图,看一下MangoFix的运转原理,然后逐个解释。
1、MangoFix脚本
首要热修正之前,咱们先要准备好热修正脚本文件,以确认咱们的修正方针和履行逻辑,这个热修正脚本文件就是咱们这儿要介绍的MangoFix脚本,正常是放在咱们的服务端,然后由App在启动时或许适当的运转期间进行下载,运用MangoFix供给的MFContext方针进行解析履行。关于MangoFix
脚本的语法规矩,这点能够参阅MangoFixQuickStart,和OC的语法非常相似,你假如有OC开发经历,相信你花10分钟便能够学会。当然,在后续的文章中我或许也会介绍这一块。
2、词法剖析器
简直一切的言语都有词法剖析器,主要是将咱们的输入文件内容分割成一个个token,MangoFix也不例外,MangoFix词法剖析器运用Lex所编写,假如你想了解MangoFix词法剖析器的代码,能够点击这儿。
3、语法剖析器
和词法剖析器相似,简直一切言语也都有自己的语法剖析器,其主要意图是将词法剖析器输出的一个个token构建成一棵笼统语法树,并且这颗笼统语法树是契合咱们预先规划好的上下文无关文法规矩的,假如你想了解MangoFix语法剖析器的代码,能够点击这儿。
4、语义检查
由于语法剖析器输出的笼统语法树,仅仅契合上下文无关文法规矩,没有上下文语义相关,所以MangoFix还会进一步做语义检查。比如咱们看下面代码:
less
复制代码
@interfaceMyViewController:UIViewController
@end
angelscript
复制代码
classMyViewController:BaseViewController{
-(void)viewDidLoad{
//TODO
}
}
上面部分是OC代码,下面部分是MangoFix代码,从文法视点MangoFix这个代码是没有问题的,但是在逻辑上却有问题,MyViewController
在本来OC中和MangoFix中承继的父类不共同,这是OCruntime所不允许的。
5、创立内置方针
MangoFix脚本中很多功用都是经过预先创立内置方针的办法支撑的,比如常用结构体的声明、变量、宏、C函数和GCD相关的操作等,假如想详细了解MangoFix中有哪些内置方针,能够点击这儿。当然MangoFix也开放了相关接口,你也能够向MangoFix履行上下文中注入你需求的方针。
6、履行顶层语句
在做完上面的操作后,MangoFix解析器就开始真实履行MangoFix脚本了,比如顶层语句的履行、结构体的声明、类的界说等。
7、运用runtime热修正
现在就到了最要害一步了,就是运用runtime替换掉本来Method的IMP指针,MangoFix运用libffi库动态创立C函数,在创立的C函数中调用MangoFix脚本中办法,然后用刚刚创立的C函数替换本来Method的IMP指针,当然MangoFix也会保存原有的IMP指针,只不过这时分该IMP指针对应的selector要在原有的基础上在前面拼接上ORG
,这一点和JSPatch共同。当然,MangoFix也支撑对属性的增加。
8、MangoFix办法履行
最终当被修正的OC办法在被调用的时分,程序会走到咱们动态创立的C函数中,在该函数中咱们经过查找一个全局的办法替换表,找到对应的MangoFix办法实现,然后运用MangoFix解析器履行该MangoFix的办法。
二.详细履行(OC修正OC)。
1.后台分发补丁渠道:
补丁渠道:patchhub.top/mangofix/lo…
github地址:github.com/yanshuimu/M…
-
首要你要明白:有必要得有个后台去上传,分发bug的文件,安全起见,脚本现现已过AES128加密,终端收到加密的脚本再去解密,防止被劫持和篡改,形成代码呈现问题。
登录这个补丁渠道,能够快速创立appid。
github地址下载并配合运用:
以下是MangoFixUtil的说明:
MangoFixUtil是对MangoFix进行了简略的封装,该库在OC项目中实战现已近2年多,经过多次迭代,比较成熟。但需求调配补丁办理后台一起运用,后台由作者开发保护,目前有50+个已上架AppStore的运用在运用,欢迎小伙伴们运用。 -
举个实战中的例子:
咱们快速迭代中遇到的一些问题:
有一次咱们解析到后台数据从中间截取字符串,然而忘了做判空操作,后台数据一旦不给回来,那么项目立马溃散,所以做了热修正demo.mg文件放到Patch办理渠道,详细代码如OC基本共同:
classJRMineLoginHeaderView:JRTableViewHeaderView{
-(NSString*)getNetStringNnm:(NSString*)str{
NSError*error=nil;
if(str.length<=0){
return@"";
}
NSRegularExpression*regex=NSRegularExpression.regularExpressionWithPattern:options:error:(@"\d+",0,&error);
if(error){
return@"";
}else{
if(str.length==0){
return@"";
}
NSArray*matches=regex.matchesInString:options:range:(str,0,NSMakeRange(0,str.length));
for(NSTextCheckingResult*matchinmatches){
NSString*matchString=str.substringWithRange:(match.range);
returnmatchString;
}
}
return@"";
}
}
以上代码中,新增了方针长度判空操作:if(str.length<=0){
return@””;
}
完美的解决了溃散的问题。
2.oc转化成DSL言语。
一切准备就绪,oc转化成DSL言语浪费人力,并且准确率又低怎么办?怎么能够快速的用oc转化成mangofix言语呢?
这是macOS体系上的可视化辅助工具,将OC言语转成mangofix脚本。
做iOS热修正时,很多时刻浪费在OC代码翻译成脚本上,供给这个辅助工具,期望能给iOSer供给便利,
自己写了一个mac运用,完美的解决了不同语法障碍,转化问题。
mac版别最低(macos10.11)支撑内容:
(1)OC代码一键批量转化成脚本
(2)支撑复制.m内容张贴,转化
(3)支撑单个OCAPI转化,主动补全
(4)报错提示:根据行号定位到OC代码行
话不多说,上地址:
pub-13a255da812e460bb9571dad9bb2e123.r2.dev/OC2PatchToo…
3.打不开“OC2PatchTool.app”,因为它来自身份不明的开发者
计划1.体系偏好设置>>安全与隐私>>允许装置未知来历
计划2.打开Terminal终端后,在命令提示后输入
sudospctl--master-disable
OC转化成脚本支撑两种办法
办法1.拷贝.m文件一切内容,张贴到OC输入框内。示例代码:AFHTTPSessionManager.m
办法2.拷贝某个办法张贴到OC输入框内,转化时会主动补全
三.App审阅剖析
其实能不能成功上线是热修正的首要前提,咱们辛辛苦苦开的框架假如上不了线,那一切都是徒劳无功。下面就来剖析下其审阅危险。
-首要这个是经过很多C言语混编转化的,所以苹果审阅无法经过静态代码识别,这一点是没有问题的。
-其次体系库内部也很多运用了音讯转发机制。这一点能够经过符号断点验证_objc_msgForward
和forwardInvocation:
。所以不存在危险。此外,你还能够经过一些字符串拼接和base64编码办法进行混淆,这样就愈加安全了。
-除非苹果选用动态检验音讯转发,非体系调用都不能运用,但这个本钱太大了,简直不或许。
-Mangofix库目前线上有很多运用,为此不用担心。就算Mangofix被禁用,参阅Mangofix自己开发也不难。
综上所述:超低审阅危险。
热修正框架仅仅为了更好的控制线上bug影响规模和给用户更好的体验。
建议:
Hotfix会在运用程序运转时动态地加载代码,因而需求进行充分的测验,以确保修正的bug或增加的新功用不会导致运用程序溃散或呈现其他问题。