iOS 5分鐘集成熱修復(JSPatch)

前言

掘金3.5.2上線後發現了一個bug,我司iOS小哥上線前不當心改動了一部分代碼,致使髒數據被緩存,取緩存的時候會致使項目崩潰...(蘋果的審覈愈來愈不認真了....好吧,我不推鍋了,讓我跪着寫完這篇博客)..javascript

迴歸正題:

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

這裏有一篇掘金裏介紹熱修復的文章: iOS中的HotFix方案總結詳解git

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

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

上代碼

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

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

OC:緩存

Swift:服務器

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

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

Swift Runtime分析:還像OC Runtime同樣嗎?ide


第二步:打開JSPatch網站下載SDK:jspatch.com/Index/sdk


第三步:項目配置(這步稍微會有些複雜)

在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官網點擊左上角註冊 -> 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在類/方法名以前添加工程名
  • 若是項目跑起來控制檯輸出沒有找到文檔就是網站上配置錯了
  • js上傳的時候必定要加密,必定要加密,必定要加密

基本使用姿式

發現bug->在項目裏修復bug->將修改後的有問題的類和方法翻譯成js並上傳網站->發佈補丁

這一次的Bug實在是對不起各位用戶老爺,讓我跪着等到加急審覈完畢,並利用此次學會的熱修復技術來保證之後都不會讓各位老爺遇到今天狀況了...

8月27日補充

JS必定要加密,下面是方法截圖和文檔:

加密方法:

文檔:jspatch.com/Docs/rsa

相關文章
相關標籤/搜索