基于JSPatch的iOS应用线上Bug的即时修复方案,附源码.

简介: 限于iOS AppStore的审核机制,一些新的功能的添加或者bug的修复,想做些节日专属的活动等,几乎都是不太可能的.从已有的经验来看,也是有了一些比较常用的解决方案.本文先是会简单说明对比大部分方案,然后会注重阐述基于JSPatch的在线更新机制的设计和实现.对于任何一家有一定用户基础的iOS应用来说,在线更新技术所产生的直接和间接价值都将远远超过100W.理解,并掌握它;实在没有

限于iOS AppStore的审核机制,一些新的功能的添加或者bug的修复,想做些节日专属的活动等,几乎都是不太可能的.从已有的经验来看,也是有了一些比较常用的解决方案.本文先是会简单说明对比大部分方案,然后会注重阐述基于JSPatch的在线更新机制的设计和实现.对于任何一家有一定用户基础的iOS应用来说,在线更新技术所产生的直接和间接价值都将远远超过100W.理解,并掌握它;实在没有时间,就记住它,因为这篇文章不仅仅是讨论.

实例地址:https://github.com/ios122/ios122

几种在线更新方案的对比: 为什么是JSPatch?

方案一: 申请”加急审核”

  • 方法: 提交应用时,选择”加急审核”.
  • 优点: 操作简单,只需要重新上传应用即可;
  • 缺点:”加急审核”,肯定是不能经常使用的.
  • 简评: 我想,这可能是大多数公司遇到紧急问题时,最常使用的方案.一个应用,每年是有若干次机会申请”加急审核”,来缩短应用新版本的审核周期.通常审核周期是7天左右;”加急审核”,通常只需要3天左右.

方案二: 使用 webview + Html5 页面

  • 方法: 特定的可能需要经常换的页面使用WebView来显示,内部使用Html5的内容来填充.当需要改变页面时,只需要改变下服务器接口返回的内容即可.
  • 优点: 对于内容的更新,足够灵活和迅速.
  • 缺点: 无法修复非HTML5页面的Bug;Html5 交互和UI通常逊色于原生页面.
  • 简评: 混合应用常用的方式,如PhoneGap等;对于大多数原生应用来说,此方案基本无适用性.

方案三: 编写基于ReactNative的应用

  • 方法: 使用 ReactNative 来编写应用或应用的部分页面,更多介绍参见: React Native 官方文档中文版
  • 优点: 原生UI,原生交互,支持服务器方式在线更新应用.
  • 缺点: 对于非ReactNative编写的页面无能为力.
  • 简评: 个人主观是很看好 ReactNative的,也在慢慢踩坑;但现实是大部分公司的已有项目是基于Objetive-C的,所以基于ReactNative的在线更新策略,目前对于大多说公司来说也并不具有可行性.

方案四: 基于JSPatch实现在线补丁式更新

  • 方法: 在自己的项目中引入JSPatch库,然后参见下文继续讨论的方案细节实施即可.JSPatch的入门使用,参见: http://www.ios122.com/2015/11/jspatch/
  • 优点: 支持操作所有工程中引入的CocoaTouch库与各种第三方库.可完全自由定义与重写已有代码的逻辑.
  • 缺点: JS语法操作API,语法转换有一定成本.
  • 简评: 大多数时候,我们需要的只是重写下某个方法,甚至某个判断,某个默认值,就可以很好地修复某个线上的Bug.所以,JSPatch,已经够用了.当然,如果是对于复杂的新功能的添加的话,建议还是提交审核吧.另外,不得不说一句,JSPatch + ReactNatvie 将来或许会成为一个很强力的组合,前者侧重于Bug的修复,后者侧重于复杂新需求的添加.本文接下来的篇幅将注重讨论基于JSPatch的线上Bug的即时修复方案.

关于使用JSPatch几个技术点的分析与实现.

基本实现原理

安装本地所有补丁 –> 联网更新补丁信息,并安装有更新或新增加的补丁.注意此处的安装,指的是执行以下JS文件中的代码.此段代码会替换某个类的默认实现.当App运行到需要某个类的某个被JSPatch替换的方法时,会走JS定义的逻辑,而不再是源代码中默认的逻辑.可以看下DEMO.另外,我们的应用和示例中都使用了Objection这个依赖注入的库,你可能也要先温习下: [Objection,一个轻量级的Objective-C依赖注入框架

](http://www.ios122.com/2015/11/objection/)

文件 md5 值的获取与校验

mac上,获取某个文件的md5值,直接在终端输入命令:

关于校验md5的代码,其实最核心的是如何在oc中使用代码获取某个文件的md5值,然后进行比对.网上的示例很多,但可能不太靠谱,下面贴一段确实可行的,注意要引入系统库 #include <CommonCrypto/CommonDigest.h>:

补丁状态的管理

可以毫不夸张的说,正确理解并定义补丁状态,是整个在线更新机制最核心的一步,其他的真的只是辅助:

补丁状态的具体管理策略,参见https://github.com/ios122/ios122/blob/master/iOS122/iOS122/samples/JSPatchOnline/patch/YFPatchViewModel.m

如何在本地测试JS可用性

这个是必然要考虑的问题,一种方式是可以在工程中放一个demo.js供Debug模式下调试;另一种方式是本地返回固定的假数据,但是假数据本身的 JS文件地址,md5,版本号等都是真实的.

补丁的增删改查.

  • 增:服务器返回的补丁,本地不存在时,会默认下载存储,并执行.
  • 删: 服务器返回的补丁集中,不包含本地的某个补丁,则此补丁下次不会再被执行.
  • 改: 服务器返回的补丁,本地包含,但md5值变化,此时会重新下载此补丁.
  • 查: 会默认在应用启动时,执行所有存在,且md5值匹配的补丁.补丁集的信息,会在每次联网更新时更新.此处使用的是一个缓存库https://github.com/pinterest/PINCache

另外,整个逻辑的实现,还使用了ReactCocoa来简化逻辑代码,如果不是很熟悉,可以先看下:ReactiveCocoa,最受欢迎的iOS函数响应式编程库(2.5版),没有之一!

关于安全性

这个要根据自己App的情况,实际考虑下.我们的App网络接口是基于HTTPS的,所以不存在中间人攻击的情况.所以可以保证md5和文件路径是我们自己可控的,所以只做了最基本的md5校验.具体大家可以参考下官方的基于JSPatch的在线更新补丁实践http://jspatch.com/Docs/security:

官方有个内测的平台http://jspatch.com,来支持在线更新,但是我做的时候,是不知道的,有点重复造轮子的感觉.但是,也就两天左右就实现了,只要能捋顺补丁状态控制的时机,代码本身其实并没有真正的技术难点.另外,官方的内测平台,好像是闭源的,我不太敢用.

关于JS文件的编写.

可以先参考下文档https://github.com/bang590/JSPatch/wiki/defineClass使用文档,其实都是一一对应的语法转义.如果代码很多,官方还提供了转换工具:https://github.com/bang590/JSPatchConvertor,但是结果仅供参考,可能还需要二次修改.

关于 APPstore 审核

我们的App,嵌入了JSPatch来进行Bug修复,已经通过审核,并且刚好修复了一个很紧急的Bug.这里不做过多的口水式的讨论.

小结

如果还在为每次的APP更新而提心吊胆,请细细阅读这篇文章;在线更新的,不仅仅可以用来修复Bug呦~

目录
相关文章
|
5天前
|
安全 Java Android开发
探索安卓与iOS开发的差异:构建未来应用的关键考量
【7月更文挑战第18天】在移动应用开发的广阔天地中,安卓和iOS两大平台各领风骚。本文将深入探讨这两个平台在开发过程中的主要差异,包括编程语言、用户界面设计、性能优化、安全性以及市场策略等方面。通过比较分析,旨在为开发者提供决策支持,帮助他们选择最适合自己项目需求的平台,同时考虑到用户体验和市场需求的变化,为未来的应用开发指明方向。
|
7天前
|
Android开发 iOS开发 开发者
ios应用打包、安装和上架攻略
假如是普通的证书或普通company证书只能上架才能安装(测试的话有其他安装方法,那是另外的话题),假如是企业类型的in house证书,则可以通过在线安装的方式,比如通过上传到一些分发平台,比如香蕉云编或蒲公英生成安装码扫码安装。
20 2
|
1月前
|
Linux 数据库 iOS开发
超级签名源码/超级签/ios分发/签名端本地linux服务器完成签名
该系统完全在linux下运行,不存在使用第三方收费工具,市面上很多系统都是使用的是第三方收费系统,例如:某心签名工具,某测侠等,不开源而且需要每年交费,这种系统只是在这些工具的基础上套了一层壳。请需要系统的放大你们的眼睛。
20 0
|
1月前
|
存储 安全 编译器
我给 iOS 系统打了个补丁——修复 iOS 16 系统键盘重大 Crash
我给 iOS 系统打了个补丁——修复 iOS 16 系统键盘重大 Crash
我给 iOS 系统打了个补丁——修复 iOS 16 系统键盘重大 Crash
|
2月前
|
前端开发 JavaScript 程序员
HBuilderX使用mac打包ios应用提示苹果根证书没有安装
HBuilderX使用mac打包ios应用提示苹果根证书没有安装
49 0
|
2月前
|
定位技术 开发工具 iOS开发
ios9定位服务的app进入后台三分钟收不到经纬度,应用被挂起问题及解决方案
ios9定位服务的app进入后台三分钟收不到经纬度,应用被挂起问题及解决方案
27 0
|
2月前
|
存储 Swift iOS开发
使用Swift开发一个简单的iOS应用的详细步骤。
使用Swift开发iOS应用的步骤包括:创建Xcode项目,设计界面(Storyboard或代码),定义数据模型,实现业务逻辑,连接界面和逻辑,处理数据存储(如Core Data),添加网络请求(必要时),调试与测试,根据测试结果优化改进,最后提交至App Store或其它平台发布。
72 0