如何實現iOS熱更新

如何實現iOS熱更新

字數803 閱讀7169 評論19 喜歡42git

最近被蘋果審覈整怕了,每次提交版本都得等待一週到兩週的審覈時間,我是受不了這種速度了,因而決定研究有沒有其餘的方法跳過提交版本這個步驟,一樣可以修復bug呢,因而我找到了JSPatch,也許也有不少人以爲這是個很高大上的技術,其實否則,咱們只須要在項目裏引入極小的引擎文件,就可使用 JavaScript 調用任何 Objective-C 的原生接口,替換任意 Objective-C 原生方法。固然呢,目前主要用於下發 JS 腳本替換原生 Objective-C 代碼,實時修復線上 bug。github

JSPatch的代碼你們能夠去github 上面下載數組

首先說一下JsPatch實現的內部原理:JsPatch能作到經過JS調用和改寫OC方法最根本的緣由是 Objective-C 是動態語言,OC上全部方法的調用/類的生成都經過 Objective-C Runtime 在運行時進行,咱們能夠經過類名和方法名反射獲得相應的類和方法,也能夠替換某個類的方法爲新的實現,還能夠新註冊一個類,爲類添加方法。這裏就不詳細介紹runtime了,相關的資料我會在後續的博客裏介紹,你們再等等吧。因此 JSPatch 的原理就是:JS傳遞字符串給OC,OC經過 Runtime 接口調用和替換OC方法。這個很容易理解,JS的做用只是一個信使的做用,具體實現仍是得靠咱們OC,因此說OC仍是世界上最美的語言,哈哈。服務器

同時在這裏給你們一個比較好的網站  點這裏.這是一個OC轉JS的一個工具網站。工具

下面給你們演示一下具體實現的步驟網站

- (void)viewDidLoad
{

    UITableView* tv = [[UITableView alloc]initWithFrame:self.view.bounds
                                                 style:UITableViewStylePlain];
    self.mqTableView = tv;
    self.mqTableView.delegate = self;
    self.mqTableView.dataSource = self;
    [self.view addSubview:self.mqTableView];

}
#pragma mark -- UITableViewDataSource

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return 3;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString* i=  @"cell";
    UITableViewCell* cell = [tableView  dequeueReusableCellWithIdentifier:i];
    if (cell == nil ) {
        cell =[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault
                                    reuseIdentifier:i];
    }
    cell.textLabel.text = @"meiqing";
    cell.backgroundColor = [UIColor whiteColor];
    return cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    self.dataSource = @[@"1",@"2"];
    // 確定會超出數組範圍致使 crash
    NSString *content = self.dataSource[indexPath.row];

}

顯示的結果是這樣的spa

屏幕快照 2015-12-10 上午12.09.15.pngcode

上面的圖片是沒有修改時候的顯示,當我點擊第三行必定會閃退,怎麼修復呢?這個時候就不用發版本了,服務器能夠給咱們傳送一個js文件,文件裏的內容是這樣的接口

屏幕快照 2015-12-10 上午12.44.14.png圖片

同時,咱們在APPDelegate裏調用這個JS就能夠了,以下:

屏幕快照 2015-12-10 上午12.45.25.png

再次運行就不會出現閃退了。 整個流程下來其實挺簡單的,但願你們可以接受,若是喜歡個人文章,能夠關注我後續的文章。

相關文章
相關標籤/搜索