iOS 5分钟集成热修复(JSPatch)

KarJLQL 8年前
   <h2>前言</h2>    <p>在iOS中有很多种热修复方案,在这里我就不一一介绍了</p>    <p>这里有一篇介绍热修复的文章:</p>    <p><a href="http://www.open-open.com/lib/view/open1472565045413.html">iOS中的HotFix方案总结详解</a></p>    <p>我选择的热修复方案是JSPatch</p>    <p>我觉得JSPatch的优点有:</p>    <ul>     <li>非侵入式</li>     <li>上手快</li>     <li>相关服务成熟</li>    </ul>    <h2>上代码</h2>    <p>大神可以看重点,如果是和我一样的菜鸡就可以按照博客一步一步做,最后一定会成功让JSPatch跑起来的</p>    <h3>第一步:创建Demo,在ViewController里添加一个Label,声明一个test方法来给Label.text赋值</h3>    <p>OC:</p>    <p><img src="https://simg.open-open.com/show/0b4edd68ef590ede8fb2d8319bdc72c6.png"></p>    <p>Swift:</p>    <p><img src="https://simg.open-open.com/show/df10be976fde181f08f8450e772d334e.png"></p>    <p>为了方便label就直接在StoryBoard里拖进来了(不喜欢拖控件的小伙伴可以用代码创建)</p>    <p>Swift中为每个变量和方法添加dynamic是保证Swift方法都可以被动态替换,这里涉及到Swift Runtime的知识就不详细讲述了按例贴一篇文章:</p>    <p><a href="/misc/goto?guid=4959677476477735286" rel="nofollow,noindex">Swift Runtime分析:还像OC Runtime一样吗?</a></p>    <h3>第二步:打开JSPatch网站下载SDK: <a href="/misc/goto?guid=4959677476556041327" rel="nofollow,noindex">http://jspatch.com/Index/sdk</a></h3>    <p><img src="https://simg.open-open.com/show/ef7b53a3a1343b9c6a6b53aaa29f19b2.png"></p>    <h3>第三步:项目配置(这步稍微会有些复杂)</h3>    <p>将解压后的SDK直接拖入工程中,然后在TARGETS -> Build Phases -> Link Binary With Libraries -> + 添加 libz.dylib(或libz.tbd) 和 JavaScriptCore.framework。</p>    <p><img src="https://simg.open-open.com/show/010cba28a417239afae2666a8edb79e2.png"></p>    <p><img src="https://simg.open-open.com/show/684cac52504569ff4fd85ccafcea8123.png"></p>    <p><img src="https://simg.open-open.com/show/26a435f7bc74ebbc0c73e4e167723141.png"></p>    <p>在AppDelegate里写以下代码:</p>    <ul>     <li> <p>OC</p> <pre>  <code class="language-objectivec">- (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;  }</code></pre> </li>     <li> <p>Swift</p> <pre>  <code class="language-objectivec">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    }</code></pre> </li>    </ul>    <p>到这一步项目配置就完成了,下一步开始发补丁到项目中</p>    <h3>第四步:打开JSPatch官网点击左上角注册 -> <a href="/misc/goto?guid=4959677476638604919" rel="nofollow,noindex">http://www.jspatch.com/</a></h3>    <p><img src="https://simg.open-open.com/show/a76df58c7dde70afa7b85d6d5aa85791.png"></p>    <p>注册或登录</p>    <p><img src="https://simg.open-open.com/show/7697a6adf9492db5cc2feea84197cad6.png"></p>    <p>注册</p>    <h3>第五步:创建你的App,名字可以随便写,AppID也可以不填</h3>    <p><img src="https://simg.open-open.com/show/a78dc6892fbfb4cedab16e3765e5e898.png"></p>    <p><img src="https://simg.open-open.com/show/2f61366a313635602892b87c905b5407.png"></p>    <h3>第六步:点击添加APP版本,创建一个App版本</h3>    <p><img src="https://simg.open-open.com/show/9ae23428da3dfba79537b7c5f8fe3f0b.png"></p>    <p><img src="https://simg.open-open.com/show/4d64873a000818852b2a49f29f743837.png"></p>    <p>介绍一下创建之后的APP:</p>    <ul>     <li>appKey是之后在你项目中激活JSPatch要用到的</li>     <li>添加App版本 是按照你App的Version来创建的(如果version没写对会下载不到补丁) <p><img src="https://simg.open-open.com/show/f5d700b8f834f615813e5756aa293d5b.png"></p> </li>    </ul>    <h3>第七步:创建一个main.js文件并在里面写上以下代码:</h3>    <ul>     <li> <p>OC</p> <pre>  <code class="language-objectivec">defineClass('ViewController', {            test : function() {            self.label().setText("label的text被改掉了");            },  })</code></pre> </li>     <li> <p>Swift</p> <pre>  <code class="language-objectivec">defineClass('HotFixDemo.ViewController', {            test : function() {            self.label().setText("label的text被改掉了");            },  })</code></pre> </li>    </ul>    <p>Swift覆盖方法和类的时候要加上项目名,所以规范应该是 项目名.类名(方法名) 注册类的时候也要加上项目名</p>    <h3>第八步:点击刚刚创建的1.0,将保存好的JS上传到JSPatch服务器上,</h3>    <p><img src="https://simg.open-open.com/show/5e784a66ebea10b0c4527863821f0e55.png"></p>    <p><img src="https://simg.open-open.com/show/b2d7b067cd85793314e39d60193092ac.png"></p>    <p><img src="https://simg.open-open.com/show/54ffda2c937d75353dc11faba5bf4713.png"></p>    <p>选择文件选择刚刚创建的main.js (上传补丁的时候最少要有一个main.js 如果需要上传多个文件点击右侧加号就可以了)</p>    <p>一定先勾选开发预览,这样才能保证测试成功</p>    <p>一切都操作完之后选择提交</p>    <p>运行你的项目,如果命令行中显示以下内容就代表你的你的项目已经更新补丁了</p>    <p><img src="https://simg.open-open.com/show/9ef6cc526a1ad8f660c6b41975285197.png"></p>    <p>因为补丁是先下载再生效的,所以下一次运行你才能看到效果</p>    <p>可以看到我的代码给label赋值为aaaa,通过JSPatch将label.text替换掉了</p>    <p><img src="https://simg.open-open.com/show/67f39e994ae08aeabb9b835579829f09.png"></p>    <p>如果遇到什么问题可以留言给我,我会及时回复并更新博客内写的不足的地方</p>    <p>一些其他的资料:</p>    <p><a href="/misc/goto?guid=4959677476728586665" rel="nofollow,noindex">JSPatch文档</a></p>    <p><a href="/misc/goto?guid=4959677476811554270" rel="nofollow,noindex">iOS黑科技之不发版线上干掉bug(JSPatch)</a></p>    <p><a href="/misc/goto?guid=4959677476881295853" rel="nofollow,noindex">Objective-C代码转换成JavaScript</a></p>    <p>可能遇到的坑</p>    <ul>     <li>JSPatch网站上的版本要一定要和工程里的一样</li>     <li>label的名字别写错了..我顺手就给写成别的名字了</li>     <li>Swift一定要在方法和属性前加dynamic,如果不是继承自NSObject的Swift类不能被动态替换</li>     <li>Swift替换类和方法要比OC在类/方法名之前添加工程名</li>     <li>如果项目跑起来控制台输出没有找到文档就是网站上配置错了</li>    </ul>    <p>基本使用姿势</p>    <p>发现bug->在项目里修复bug->将修改后的有问题的类和方法翻译成js并上传网站->发布补丁</p>    <p> </p>    <p>来自:http://www.jianshu.com/p/950dbb33a370</p>    <p> </p>