熱修復(fù)/熱補(bǔ)丁下載及使用

其實(shí)熱修復(fù)本身也是一個(gè)比較雞肋的東西, 如果公司項(xiàng)目做的很好的話,一般會(huì)比較少用到這個(gè)東西
但是JSPatch 方式的熱修復(fù)可以我們避免頻繁的提交項(xiàng)目到AppStore, 當(dāng)項(xiàng)目有重大bug時(shí), 我們免去了審核的時(shí)間, 可以隨時(shí)對(duì)項(xiàng)目進(jìn)行修復(fù), 避免造成損失

下面我以簡單的修改方式, 來演示熱修復(fù)的使用過程

寫在前面:
首先感謝bang大神的熱修復(fù)的解決方案, gitHub下載地址: JSPatch
我們也可以使用cocoaPods pod 'JSPatchSDK'的方式,或者你也可以直接從JSPatch平臺(tái)來下載: JSPatch平臺(tái)

一: 創(chuàng)建項(xiàng)目

我創(chuàng)建了一個(gè)測試的項(xiàng)目, 我們?cè)?code>ViewController類的- (void)viewDidLoad方法中, 對(duì)我們創(chuàng)建好的一個(gè)label,進(jìn)行賦值

Snip20170105_1.png

二: 項(xiàng)目配置

  1. 如果你使用從gitHub下載的方式來手動(dòng)導(dǎo)入, 那么需要把下載的壓縮包解壓縮,然后JSPatch文件夾下的三個(gè)文件: JPEngine.h, JPEngine.m, JSPatch.js導(dǎo)入到你的項(xiàng)目中, 如果是使用JSPatch平臺(tái)下載的話, 那么把解壓縮后的JSPatchPlatform.framework導(dǎo)入到你的項(xiàng)目中

2.因?yàn)闊嵝迯?fù)需要使用JavaScript語言來進(jìn)行, 所以需要導(dǎo)入JavaScriptCore.frameworklibz.tdb

3.因?yàn)閕OS9引入了新特性App Transport Security(ATS)所以需要使用HTTPS協(xié)議, 我們通過下面的方式來規(guī)避這個(gè)問題
objc

  1. 在info.plist中添加NSAppTransportSecurity類型為Dictionary.
  2. 在NSAppTransportSecurity中添加NSAllowsArbitraryLoads類型為Boolean,值為YES

如果沒有添加這個(gè)字段, 那么會(huì)導(dǎo)致你的控制臺(tái)打印如下的錯(cuò)誤:

The resource could not be loaded because the App Transport Security policy requires the use of a secure connection.

三: 平臺(tái)配置

1.打開JSPatch平臺(tái), 我們的更新內(nèi)容需要在這個(gè)平臺(tái)上托管,并且在平臺(tái)上注冊(cè)賬號(hào), 并添加APP, AppID 測試可以不填

Snip20170105_2.png

創(chuàng)建完成之后在項(xiàng)目的左側(cè)可以看見你的APPKey,右側(cè)有一個(gè)添加APP版本

Snip20170105_3.png

點(diǎn)擊進(jìn)入之后填寫你需要更新的APP版本號(hào), 這個(gè)版本號(hào)與你項(xiàng)目的version對(duì)應(yīng), 注意不要填錯(cuò)

2.在你的項(xiàng)目的APPDelegate類導(dǎo)入頭文件#import <JSPatch/JSPatch.h>
并在- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法中添加如下代碼

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
   // Override point for customization after application launch.
//#ifdef DEBUG
//    [JSPatch setupDevelopment];
//#endif
   [JSPatch startWithAppKey:@"ffc4f4ffcf7a45f2"];
   //用來檢測回調(diào)的狀態(tài),是更新或者是執(zhí)行腳本之類的,相關(guān)信息,會(huì)打印在你的控制臺(tái)
   [JSPatch setupCallback:^(JPCallbackType type, NSDictionary *data, NSError *error) {
       
   }];
   [JSPatch setupDevelopment];
   [JSPatch sync];
//    [JSPatch testScriptInBundle];
   return YES;
}

startWithAppKey后面跟著的就是第1步驟獲取的AppKey
3.創(chuàng)建main.js文件, 修改項(xiàng)目中你想修改的地方, 例如,我在項(xiàng)目中把這個(gè)文字修改掉,

defineClass('ViewController', {
            viewDidLoad: function() {
            self.super().viewDidLoad();
            // Do any additional setup after loading the view, typically from a nib.
            self.contentLabel().setText("我要去日本");
            },
            });

這里defineClass('ViewController',{ })意味著找到ViewController這個(gè)類, 然后找到這個(gè)類中的viewDidLoad:方法

self.super().viewDidLoad();
self.contentLabel().setText("我要去日本");

當(dāng)然JSPatch平臺(tái)也提供了語言轉(zhuǎn)換工具,我們可以把我們的OC語言轉(zhuǎn)換為JavaScript語言,然后再復(fù)制到main.js
當(dāng)然如果你使用這個(gè)工具也不是萬能的, 如果有類似創(chuàng)建控件的frame的情況,就需要手動(dòng)改動(dòng)
UILabel.alloc().initWithFrame({x:100, y:100, width:100, height:100});

  1. 回到JSPatch平臺(tái)中, 再次點(diǎn)擊剛剛創(chuàng)建的應(yīng)用版本, 點(diǎn)擊選擇文件, 把main.js添加上去,如果你想添加多個(gè)補(bǔ)丁可以點(diǎn)擊選擇文件繼續(xù)添加, 然后選擇開發(fā)預(yù)覽之后提交
Snip20170105_6.png

然后點(diǎn)擊全量下發(fā)

Snip20170105_7.png

5.運(yùn)行你的程序這樣就完成了全部過程, 值得一說的是, 由于補(bǔ)丁是先下載, 然后運(yùn)行, 所以第一次運(yùn)行時(shí)不會(huì)顯示, 需要再次運(yùn)行一遍, 你就會(huì)看到變化了

Snip20170105_9.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容