關於iOS 熱更新(熱修復)你必須知道的一種方法- JSPatch

本文爲轉載文章 . 版權歸原文全部。git

原文連接:iOS 5分鐘集成熱修復(JSPatch)github

 

前言

在iOS中有不少種熱修復方案,在這裏我就不一一介紹了swift

這裏有一篇介紹熱修復的文章:
iOS中的HotFix方案總結詳解服務器

我選擇的熱修復方案是JSPatch
我以爲JSPatch的優勢有:app

  • 非侵入式
  • 上手快
  • 相關服務成熟

上代碼

大神能夠看重點,若是是和我同樣的菜雞就能夠按照博客一步一步作,最後必定會成功讓JSPatch跑起來的jsp

第一步:建立Demo,在ViewController裏添加一個Label,聲明一個test方法來給Label.text賦值

OC:ide

Swift:測試

爲了方便label就直接在StoryBoard裏拖進來了(不喜歡拖控件的小夥伴能夠用代碼建立)網站

Swift中爲每一個變量和方法添加dynamic是保證Swift方法均可以被動態替換,這裏涉及到Swift Runtime的知識就不詳細講述了按例貼一篇文章:ui

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

加密方法:

相關文章
相關標籤/搜索