本文为转载文章 . 版权归原文所有。

原文链接:iOS 5分钟集成热修复(JSPatch)

前言

在iOS中有很多种热修复方案,在这里我就不一一介绍了

这里有一篇介绍热修复的文章:
iOS中的HotFix方案总结详解

我选择的热修复方案是JSPatch
我觉得JSPatch的优点有:

  • 非侵入式
  • 上手快
  • 相关服务成熟

上代码

大神可以看重点,如果是和我一样的菜鸡就可以按照博客一步一步做,最后一定会成功让JSPatch跑起来的

第一步:创建Demo,在ViewController里添加一个Label,声明一个test方法来给Label.text赋值

OC:

Swift:

为了方便label就直接在StoryBoard里拖进来了(不喜欢拖控件的小伙伴可以用代码创建)

Swift中为每个变量和方法添加dynamic是保证Swift方法都可以被动态替换,这里涉及到Swift Runtime的知识就不详细讲述了按例贴一篇文章:

Swift Runtime分析:还像OC Runtime一样吗?


第二步:打开JSPatch网站下载SDK:http://jspatch.com/Index/sdk


第三步:项目配置(这步稍微会有些复杂)

将解压后的SDK直接拖入工程中,然后在TARGETS -> Build Phases -> Link Binary With Libraries -> + 添加 libz.dylib(或libz.tbd) 和 JavaScriptCore.framework。

在AppDelegate里写以下代码:

  • OC

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {// Override point for customization after application launch.[JSPatch startWithAppKey:@"你的AppKey"]; //用来检测回调的状态,是更新或者是执行脚本之类的,相关信息,会打印在你的控制台 [JSPatch setupCallback:^(JPCallbackType type, NSDictionary *data, NSError *error) { }]; [JSPatch setupDevelopment]; [JSPatch sync]; return YES; }
  • Swift

      func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { // Override point for customization after application launch. JSPatch.startWithAppKey("你的Appkey") JSPatch.setupCallback { (type, data, error) in print(type) print(data) } JSPatch.setupDevelopment() JSPatch.sync() return true }

到这一步项目配置就完成了,下一步开始发补丁到项目中


第四步:打开JSPatch官网点击左上角注册 ->http://www.jspatch.com/

注册或登录

注册


第五步:创建你的App,名字可以随便写,AppID也可以不填


第六步:点击添加APP版本,创建一个App版本

介绍一下创建之后的APP:

  • appKey是之后在你项目中激活JSPatch要用到的
  • 添加App版本 是按照你App的Version来创建的(如果version没写对会下载不到补丁)

第七步:创建一个main.js文件并在里面写上以下代码:

  • OC

    defineClass('ViewController', {test : function() {self.label().setText("label的text被改掉了");},
    })
  • Swift

    defineClass('HotFixDemo.ViewController', {test : function() {self.label().setText("label的text被改掉了");},
    })

Swift覆盖方法和类的时候要加上项目名,所以规范应该是 项目名.类名(方法名) 注册类的时候也要加上项目名

第八步:点击刚刚创建的1.0,将保存好的JS上传到JSPatch服务器上,

选择文件选择刚刚创建的main.js (上传补丁的时候最少要有一个main.js 如果需要上传多个文件点击右侧加号就可以了)

一定先勾选开发预览,这样才能保证测试成功

一切都操作完之后选择提交

运行你的项目,如果命令行中显示以下内容就代表你的你的项目已经更新补丁了

因为补丁是先下载再生效的,所以下一次运行你才能看到效果

可以看到我的代码给label赋值为aaaa,通过JSPatch将label.text替换掉了

如果遇到什么问题可以留言给我,我会及时回复并更新博客内写的不足的地方

一些其他的资料:

JSPatch文档

iOS黑科技之不发版线上干掉bug(JSPatch)

Objective-C代码转换成JavaScript

可能遇到的坑

  • JSPatch网站上的版本要一定要和工程里的一样
  • label的名字别写错了..我顺手就给写成别的名字了
  • Swift一定要在方法和属性前加dynamic,如果不是继承自NSObject的Swift类不能被动态替换
  • Swift替换类和方法要比OC在类/方法名之前添加工程名
  • 如果项目跑起来控制台输出没有找到文档就是网站上配置错了

基本使用姿势

发现bug->在项目里修复bug->将修改后的有问题的类和方法翻译成js并上传网站->发布补丁

8月27日补充

JS一定要加密,下面是方法截图和文档:

文档:http://jspatch.com/Docs/rsa

加密方法:

转载于:https://www.cnblogs.com/yajunLi/p/6393584.html

关于iOS 热更新(热修复)你必须知道的一种方法- JSPatch相关推荐

  1. iOS 热更新/热修复

    热更新/热修复(调研的可能不全) 热更新 1.* Flutter * 由于渲染的基础(gdi)是自己实现的,所以实现跨平台.性能优化.摆脱平台约束方面的裕度更大.从实际体验来看, Flutter 的性 ...

  2. android 热更新 方案,热更新-热更新app开发的两种系统方案!

    针对app开发工作人员来讲,除开要会编码,热更新也是一定要学好和把握的方法,从技术性视角而言,热更新对Android和iOS各自有不一样的系统软件方案,为了更好地让大伙儿掌握这二种系统方案的差别,今日 ...

  3. Windows更新补丁下载、批量安装的几种方法

    Windows更新补丁下载.批量安装的几种方法 对于广大电脑爱好者而言,打补丁已经是"家常便饭".每次重装系统后,之前系统更新过的补丁也随之毁于一旦,不得不再次连接到微软的网站,将 ...

  4. 【安卓】腾讯Bugly之应用升级热更新-热更新

    如何接入请参阅 [安卓]腾讯Bugly之应用升级&热更新-接入篇 什么是热更新: 热更新能力是Bugly为解决开发者紧急修复线上bug,而无需重新发版让用户无感知就能把问题修复的一项能力.Bu ...

  5. 开机f8修复电脑步骤_知识 | 8种方法修复电脑无法开机问题

    以下方法同时适用于台式电脑.笔记本电脑和所有 Windows 系统. 01 基础检测 如果按下电源后,电脑风扇.电源灯和屏幕等都没有任何反应,可能是因为没有通电.台式机请尝试重新连接电源线. 笔记本电 ...

  6. iOS中给图片加水印或文字的几种方法

    最近项目中在做实名认证,要给图片添加水印,在网上找了一些博客,但是鱼龙混杂,首先说明下,有的博客说的方法实现了一下发现不可以.现在我就把我找的可以实现的几种方法贴在下边即可.以下方法我都亲自试过可以: ...

  7. 如何不让计算机更新软件,Windows10自动安装更新让人厌烦,用这3种方法,彻底禁止它...

    在本文中,我将向你介绍三种方法来禁止Windows 10上的自动更新,并让你决定下载和安装自动更新的方法. 本文目录 使用设置禁用自动更新使用组策略禁用自动更新使用注册表禁用自动更新 在Windows ...

  8. iOS之热更新/热修复JSPatch 补丁更新管理

    总结: 1.在传输过程中对JS文件进行了RSA签名加密: 2.下载完脚本保存到本地时,应进行简单的对称加密,每次读取时解密: 3.建议js脚本的增.删.改.查的内容在同一个js文件处理,只下载一个文件 ...

  9. 修复iPhone8白屏的3种方法,可保留设备数据

    使用iPhone8的用户遇到过下图这样白屏情况吗?出现白屏问题,可能是误按.挤压.或其它系统问题所导致的. 但要分清楚白屏和白屏黑苹果两种情况.白屏是手机屏幕全部呈现白色,而白屏中多了白屏黑苹果的标志 ...

最新文章

  1. Windows下修改jupyter默认工作路径教程
  2. FungalTraits: 超越FUNGuild的最新真菌表型数据库
  3. Win10 + RTX3090 安装CUDA11.2 + CUDNN8.1.0 安装
  4. 通讯系统经验谈【一】TCP连接状态分析:SYNC_RECV,CLOSE_WAIT,TIME_WAIT
  5. 从Tensorflow代码中理解LSTM网络
  6. java 自旋锁_java锁的种类以及辨析(一):自旋锁
  7. 英文Ubantu系统安装中文输入法
  8. iOS 6 自动布局入门
  9. 如何在excel不同的工作表之间使用数据有效性?
  10. C语言 memcpy_s 函数 - C语言零基础入门教程
  11. 原因及解决办法:error while loading shared libraries: libgtk-x11-2.0.so.0: cannot open shared object file
  12. 用python设计简易计算器代码_Python简易计算器制作方法代码详解
  13. 简单好用的应用加密软件:Cisdem AppCrypt Mac版
  14. 六款很6的电脑驱动管理器:驱动升级用什么软件好 | 国外最好的电脑驱动管理软件推荐
  15. D:\ProgramData\Anaconda3\envs\test_onnx\python.exe: No module named pip
  16. H5播放HLS之videojs播放视频
  17. SWITCH 和ROUTE的故事(来自Csico论坛)
  18. 【rmzt:杀个浠巴烂win7主题】
  19. 在线文章生成-自动文章生成
  20. 2023最新自动采集影视CMS程序源码+全开源的/功能也强大

热门文章

  1. 51单片机sht30_基于51单片机和机智云的WIFI智能插座(2019版)
  2. 代码块_Dynamo?Get 7.1 什么是代码块
  3. 试题14 回文数(详解)
  4. 假设系统中共有5个{P0,P1,P2,P3,P4}和A,B,C三类资源;A类资源共有10个,B类资源共有5个,C类资源共有7个。在时刻T0,系统资源分配情况如下表8-14所示。
  5. 2013年C++A:买不到的数目(互质数)
  6. 将ShaderToy中的Shader搬运到Unity
  7. OpenGL基础41:几何着色器
  8. static_cast与dynamic_cast类型转换
  9. jQuery Mobile 所有data-*选项,开发全解+完美注释
  10. quartus仿真18:仿真简单D触发器和JK触发器输出的波形