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

KarJLQL 8年前發布 | 80K 次閱讀 JSPatch iOS開發 移動開發

前言

在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; }</code></pre> </li>

  • 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
      }
  • </ul>

    到這一步項目配置就完成了,下一步開始發補丁到項目中

    第四步:打開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并上傳網站->發布補丁

     

    來自:http://www.jianshu.com/p/950dbb33a370

     

 本文由用戶 KarJLQL 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!